WPF使用BasedOn继承样式时Validation.ErrorTemplate不生效问题
WPF 继承样式时Validation.ErrorTemplate无法正常显示的解决方案
核心问题原因
使用BasedOn继承父样式时,父样式的Validation.ErrorTemplate默认设置、触发器优先级规则,以及ErrorTemplate内的绑定上下文变动,会导致自定义模板无法正常渲染内容,仅显示空边框。不使用BasedOn时没有父样式干扰,绑定上下文也刚好匹配模板要求,所以功能正常。
具体解决步骤
- 步骤1:调整样式中ErrorTemplate的设置位置
将Validation.ErrorTemplate从触发器中移动到样式的全局Setter,避免父样式的默认值或触发器覆盖你的自定义配置:
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource 你要继承的基础样式Key}"> <!-- 全局设置自定义错误模板,优先级高于父样式Setter --> <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ValidationErrorTemplate}"/> <Style.Triggers> <Trigger Property="Validation.HasError" Value="True"> <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="3"/> </Trigger> </Style.Triggers> </Style>
- 步骤2:修正ErrorTemplate内的绑定路径
显式绑定错误集合到装饰元素的附加属性,避免继承样式后上下文变动导致绑定失效:
<ControlTemplate x:Key="ValidationErrorTemplate"> <StackPanel ClipToBounds="False"> <Border BorderBrush="Red" ClipToBounds="False" BorderThickness="2" HorizontalAlignment="Left" > <AdornedElementPlaceholder x:Name="AdornedElement" /> </Border> <Border BorderBrush="Red" ClipToBounds="False" Padding="1" BorderThickness="1,1,1,1" HorizontalAlignment="Left" Background="Black" Margin="0,2,0,0"> <!-- 显式绑定到装饰元素的校验错误集合,避免上下文变动导致绑定失效 --> <ItemsControl ItemsSource="{Binding ElementName=AdornedElement, Path=AdornedElement.(Validation.Errors)}" HorizontalAlignment="Left"> <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding ErrorContent}" ClipToBounds="False" Foreground="Red" TextWrapping="WrapWithOverflow" Width="250"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Border> </StackPanel> </ControlTemplate>
- 步骤3:显式开启绑定的校验配置
给TextBox的绑定加上校验相关参数,确保继承样式后校验逻辑不会被默认关闭:
<Grid> <TextBox Text="{Binding SomeText, ValidatesOnNotifyDataErrors=True, UpdateSourceTrigger=PropertyChanged}" MaxHeight="100"/> </Grid>
以上修改完成后即可同时保留基础样式的全部特性,又能正常显示完整的自定义错误模板内容。
内容的提问来源于stack exchange,提问作者Hrethric
相关产品推荐
相关产品推荐

