2011-11-07 65 views
3

我们通过StatusBar中的Validation.ValidationAdornerSite显示我们的错误。通过使用ValidationAdornerSite,似乎wpf禁用了Validation.ErrorTemplate。同时使用ValidationAdornerSite和ErrorTemplate

我该怎么做才能实现ErrorTemplate的显示?我们目前有一个妥协方案,我们只在ValidationAdornersite上通过触发器将其设置在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

这看起来相当棘手,因为它似乎是一个内部的WPF事情。 (哦,他们希望验证会出现在那里...我们会关闭它)。也许尝试在代码中设置它,只是为了调试是否在另一个设置时实际上被切换。 –

回答

1

用ILSpy查看Validation是如何实现的后,我得出结论,这种行为是不能改变的。

做类似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”。注意这个解决方案可以简化,但它符合我的需要,因为我的验证控件位于不知道窗口(shell)的模块(PRISM)内。