我有下面的xaml标记:
<GroupBox Margin="10" Padding="20" Header="Case 5 - Custom Error Object">
<GroupBox.DataContext>
<local:ViewModel4/>
</GroupBox.DataContext>
<StackPanel>
<Label Name="AdornerElement" Style="{StaticResource ResourceKey=AdornerElementStyle}"/>
<TextBox Text="{Binding Path=UserName, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True}"
Margin="0 10"
Validation.ValidationAdornerSite="{Binding ElementName=AdornerElement}">
</TextBox>
</StackPanel>
</GroupBox>
和以下样式:
<Style x:Key="AdornerElementStyle" TargetType="Label">
<Setter Property="Visibility" Value="Collapsed"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Label">
<StackPanel Orientation="Horizontal" Background="LightCoral">
<Image Source="/clipart.png" Width="24" Margin="10"/>
<ItemsControl ItemsSource="{Binding ElementName=AdornerElement, Path=(Validation.ValidationAdornerSiteFor).(Validation.Errors)}"
VerticalAlignment="Center">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=ErrorContent.ValidationMessage}"
Style="{StaticResource CustomErrorTypeStyle}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding ElementName=AdornerElement, Path=Validation.HasError}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
除了Trigger,一切都正常。
如果我最初将属性“Visibility”设置为“Visible”,则可以看到错误消息正确显示。
如果我使用之前显示的样式,则Label保持为折叠状态。
请帮助我正确地使用触发器来达到最终的结果。
1条答案
按热度按时间lf5gs5x21#
这不是
Validation.ValidationAdornerSite
的工作方式。这个附加的属性只定义了将用验证错误模板装饰的元素。默认情况下,这是正在验证的元素,更准确地说是Binding.Target
。当您设定
Validation.ValidationAdornerSite
时,系结引擎会自动设定附加的Validation.ValidationAdornerSiteFor
属性,以指涉最初设定Validation.ValidationAdornerSite
的元素。这意味着
Validation.HasError
和其他相关的附加属性始终在Binding.Target
上设置,而不是在装饰器站点上设置。这就是为什么你的触发器不起作用:它们在
Label
上触发,而不是在TextBox
(注册验证/绑定错误的位置)上触发。若要修正此问题,
DataTrigger
必须取得Validation.ValidationAdornerSiteFor
附加属性的Validation.HasErrors
附加属性值,此附加属性值会指涉原始Binding.Target
(TextBox
)。备注
不清楚为什么要使用
Label
来显示错误消息。您可以简单地定义一个错误模板,即由附加的Validation.ErrorTemplate
属性引用的ControlTemplate
。这将大大简化您的代码。下面的示例创建了完全相同的可视错误反馈,但没有额外的
Label
和关联的触发器来管理错误消息的可见性。所有这些都由WPF绑定引擎处理。