2014-10-06 23 views
1

我希望我的錯誤模板看起來不同,具體取決於裝飾控件上的某些屬性值。訪問AdornedElementPlaceholder屬性的Validation.ErrorTemplate

像下面那樣設置TargetType會導致運行時異常:'TextBox'ControlTemplate TargetType與模板類型'Control'不匹配。因此,ErrorTemplate似乎必須使用'Control'的targetType。

<ControlTemplate x:Key="ValidationErrorTemplate" TargetType={x:Type TextBox}> 
    <Grid> 
    <AdornedElementPlaceholder HorizontalAlignment="Left" Name="placeholder"/> 
    <Grid Background="Yellow"> 
     <Grid.Style> 
     <Style TargetType="Grid"> 
      <Style.Triggers> 
      <DataTrigger Binding="{TemplateBinding IsReadOnly}" Value="True"> 
       <Setter Property="Background" Value="Green"/> 
      </DataTrigger> 
      </Style.Triggers> 
     </Style> 
     </Grid.Style> 
    </Grid> 
    </Grid> 
</ControlTemplate> 

我刪除了目標類型,然後嘗試這樣:

<DataTrigger Binding="{Binding IsReadOnly, RelativeSource={RelativeSource AncestorType={x:Type TextBox}}}" Value="True"> 
    <Setter Property="Background" Value="Green"/> 
</DataTrigger> 

然後這個沒有產生任何異常,但也沒什麼效果:

<DataTrigger Binding="{Binding AdornedElement.(TextBox.IsReadOnly), ElementName=placeholder}" Value="True"> 
    <Setter Property="Background" Value="Orange"/> 
</DataTrigger> 

,這沒有產生任何異常但也沒有影響:

<DataTrigger Binding="{Binding (TextBox.IsReadOnly), ElementName=placeholder}" Value="True"> 
    <Setter Property="Background" Value="Orange"/> 
</DataTrigger> 

最後這一點,這產生了「BindingExpression路徑錯誤:在‘對象’‘’AdornedElementPlaceholder「未找到‘IsReadOnly’屬性」:

<DataTrigger Binding="{Binding IsReadOnly, ElementName=placeholder}" Value="True"> 
    <Setter Property="Background" Value="Green"/> 
</DataTrigger> 

有沒有人對如何在ErrorTemplate引用依賴屬性的任何其他的想法?

回答

2

正確答案是:

<DataTrigger Binding="{Binding AdornedElement.(TextBox.IsReadOnly), ElementName=placeholder}" Value="True"> 
    <Setter Property="Background" Value="Orange"/> 
</DataTrigger> 

雖然這是我失敗的嘗試早,我的測試設置是有缺陷之一。我在網格上設置了默認的背景屬性,而不是將其設置爲樣式。由於依賴屬性的優先順序,直接在對象上設置的值將總是勝過在樣式中設置的任何值(特別是在我的觸發器中)。

這裏是一個工作設置:

這裏
<ControlTemplate x:Key="ValidationErrorTemplate"> 
    <Grid> 
    <Grid.Style> 
     <Style TargetType="{x:Type Grid}"> 
     <Setter Property="Background" Value="Yellow"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding AdornedElement.(TextBox.IsReadOnly), ElementName=placeholder}" Value="True"> 
      <Setter Property="Background" Value="Orange"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </Grid.Style> 

    <AdornedElementPlaceholder Name="placeholder"/> 
    </Grid> 
</ControlTemplate> 

一個關鍵是,AdornedElement總是類型的控制,所以你必須做相應的資質(或投?)來訪問性能上未控制曝光。這是通過圍繞類名稱和屬性的圓括號完成的。另一個例子是:AdornedElement。(CheckBox.IsChecked)。由於IsChecked不在控制之上,因此必須通過明確聲明擁有該屬性的類類型來限定它。