注意我已经提出了相关问题:如何组合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>

我使用上面的数据触发器来清除不可用的项目。

我面临的问题是选择项目的事实与模板绑定的基础数据无关。我真正想要的是某种多触发器,它支持依赖属性上的常规 Trigger ListBoxItem.IsSelected )以及 DataTrigger 在绑定数据项上。

这可以在不将选择概念引入我的视图模型的情况下完成吗?

对于任何想知道我为什么不禁用不可用项目的人,请理解应用程序的要求是可以选择不可用的选项。实际上有几个列表框,其中一个选项会影响其他列表框中的可用内容。我无法禁用这些项目,因为如果根据之前的选择禁用了项目,用户将无法改变主意或探索不同的组合。

有帮助吗?

解决方案

对于任何反对这个问题的人,我找到了一个适合我的解决方案。当然,我仍然有兴趣看到其他有趣的答案。

这就是我的所作所为:

<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>

其他提示

DataGridRow 一起使用,将绑定模式更改为 Self

Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=... 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top