同时使用ValidationAdornerSite和ErrorTemplate

时间:2011-11-07 13:20:15

标签: wpf validation xaml

我们通过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>

1 个答案:

答案 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)。