2011-11-07 23 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)內。