2009-03-02 151 views
39

注意我已要求相關的問題:How to combine DataTrigger and EventTrigger?WPF - 如何結合DataTrigger和觸發器?

我有一個包含多個項的列表框。該物品的類實現INotifyPropertyChanged,並有一個屬性IsAvailable。我使用該屬性來使用不同的顏色在列表中指示不可用的選項。

但是,如果選定的項目不可用,則前景色應爲紅色。

<ListBox> 
    <ListBox.Resources> 
    <DataTemplate DataType="{x:Type local:InstitutionViewModel}"> 
     <TextBlock Name="Name" Text="{Binding Name}"/> 
     <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding IsAvailable}" Value="False"> 
      <Setter TargetName="Name" Property="Foreground" Value="#888"/> 
     </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
    </ListBox.Resources> 
</ListBox> 

我使用上面的數據觸發器來灰化不可用的項目。

我面臨的問題是,該項目被選中的事實與該模板綁定的底層數據無關。我真正想要的是某種多觸發器,它支持綁定數據項上的依賴項屬性(ListBoxItem.IsSelected)上的常規Trigger以及DataTrigger

這可以在沒有將選擇概念引入我的視圖模型的情況下完成嗎?

對於任何人想知道爲什麼我不禁用不可用的項目,請理解,應用程序的要求是可選的不可用選項。實際上有幾個列表框,並且在一個效果中選擇其他的可用選項。我無法禁用這些項目,因爲如果根據較早的選擇禁用項目,用戶將無法改變主意或探索不同的組合。

回答

51

對於任何對此問題提出異議的人,我找到了適用於我的解決方案。當然,我仍然有興趣看到其他有趣的答案。

這裏就是我所做的:

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
    <Condition Binding="{Binding 
     RelativeSource={ 
     RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, 
     Path=IsSelected}" Value="True"/> 
    <Condition Binding="{Binding IsAvailable}" Value="False"/> 
    </MultiDataTrigger.Conditions> 
    <Setter TargetName="Name" Property="Foreground" Value="#F00"/> 
</MultiDataTrigger> 

沒有什麼特別之處這是一個多觸發雖然。如果你只是想在你的數據模板不同風格選擇的項目,你可以使用:

<DataTrigger Binding="{Binding 
    RelativeSource={ 
    RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, 
    Path=IsSelected}" Value="True"> 
    <Setter TargetName="Name" Property="Foreground" Value="#888"/> 
</DataTrigger> 
+2

這正是我打算推薦。據我所知這是最好的解決方案。 – 2009-03-02 15:28:29

9

要與DataGridRow變化結合模式用它來Self

Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=...