WPF – 如何结合DataTrigger和触发器?
注意我已经问了相关的问题: 如何结合DataTrigger和EventTrigger?
我有一个包含几个项目的列表框。 该项目的类实现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
。
如果不将select的概念引入我的视图模型,这可以做到吗?
对于任何人想知道为什么我不禁用不可用的项目,请理解,应用程序的要求是可选的不可用选项。 实际上有几个列表框,并在其中一个效果select其他的可用。 我不能禁用这些项目,因为如果项目在之前的select中被禁用,用户将无法改变他们的想法或探索不同的组合。
对于任何对此问题的人来说,我find了一个适合我的解决scheme。 当然,我仍然有兴趣看到其他有趣的答案。
以下是我所做的:
<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>
虽然这是一个多触发器没有什么特别的。 如果您只想在数据模板中以不同方式select项目,则可以使用:
<DataTrigger Binding="{Binding RelativeSource={ RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True"> <Setter TargetName="Name" Property="Foreground" Value="#888"/> </DataTrigger>
要使用DataGridRow
将绑定模式更改为Self
:
Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=...