2012-03-01 72 views
1

我在ResourceDictionary中將按鈕樣式設置爲DataTemplate。這裏有一小部分:DataTemplate檢查綁定是否存在

<Style TargetType="{x:Type Button}"> 
    <Setter Property="Focusable" Value="False"></Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border x:Name="border"> 
        ... 
       </Border> 
       <ControlTemplate.Triggers> 
        <DataTrigger Binding="{Binding IsSelected}" Value="True"> 
         <Setter Property="Background" TargetName="border" Value="Red" /> 
        </DataTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

在這個模板中有一個與屬性IsSelected的綁定。這種特性在那裏是一種情況,在其他情況下則不是。

如果綁定路徑存在,是否可以檢查Xaml,然後在其他情況下使用它忘記它? 現在我在調試輸出BindingExpression,我想消除這一點。

回答

1

更相關的問題是:爲什麼你的ControlTemplate中有DataTrigger?這會在控件與其數據上下文之間創建依賴關係,這就是爲什麼當數據上下文與控件模板的期望不匹配時,您會遇到此問題。

你確定你不能使用更合適的機制嗎?例如,你可以改爲使用IsSelected應該影響Background的那些按鈕的樣式嗎?

<Style x:Key="SpecialButtonStyle" TargetType="Button"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsSelected}" Value="True"> 
      <Setter Property="Background" Value="Red" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

... 

<Button DataContext="relevant data context" Style="{StaticResource SpecialButtonStyle}"/> 

,或者甚至更好,你能定義你必須具有IsSelected財產的具體數據類數據模板?該數據模板可以自動使用正確的Button風格。

+0

我如何訪問TargetName邊框?哪一種是另一種風格?這可能嗎? – San 2012-03-01 12:02:24

+1

你沒有。相反,您需要更新您的控件模板綁定到的控件的屬性。這使得數據和數據的可視化之間保持清晰的分離。在這種情況下,你可能會讓你的樣式觸發器設置'Button'的'Background'屬性。然後按鈕的控件模板中的'border'元素將使用'TemplateBinding'到按鈕的'Background'屬性。 – 2012-03-01 15:49:10