我们通过StatusBar中的Validation.ValidationAdornerSite显示错误。使用ValidationAdornerSite,似乎wpf禁用了Validation.ErrorTemplate。
如何同时实现ErrorTemplate的显示?我们目前有一个折衷方案,我们只在ValidationAdornersite上显示东西,通过Trigger在MouseOver上设置它,这样只要鼠标在控件之外就会显示ErrorTemplate。
<Style x:Key="ValidationStyle">
<Setter Property="Validation.ErrorTemplate"
Value="{StaticResource Default_ErrorTemplate}" />
<Style.Triggers>
<Trigger Property="UIElement.IsMouseOver"
Value="True">
<Setter Property="Validation.ValidationAdornerSite"
Value="{Binding ValidationAdornerSite,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
</Trigger>
<Trigger Property="Validation.HasError"
Value="true">
<Setter Property="FrameworkElement.ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
</Style>
答案 0 :(得分:1)
在查看ILSpy如何实施验证后,我得出的结论是,这种行为无法改变。
执行类似ValidationAdornerSite和ValidationAdornerSiteFor的操作要容易得多。定义两个具有相似行为的附加依赖道具。然后你用它而不是标准的adonersite道具:
<Setter Property="gw:FormValidation.ValidationSite"
Value="{Binding ValidationAdornerSite,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
...............................
<TextBlock x:Name="PART_ValidationAdornerSite"
HorizontalAlignment="Center"
Text="{Binding RelativeSource={RelativeSource Self}, Path=(gw:FormValidation.ValidationSiteFor).(Validation.Errors)[0].ErrorContent, NotifyOnTargetUpdated=True}"
TargetUpdated="PART_ValidationAdornerSite_TargetUpdated"
TextBlock.Foreground="Red"/>
...............................
this.ValidationAdornerSite = this.PART_ValidationAdornerSite;
这是一个持有dp“ValidationAdornerSite”的窗口。请注意,这个解决方案可以简化,但它符合我的需要,因为我的验证控件是在模块(PRISM)内,不知道窗口(shell)。