WPF样式中使用枚举作为触发器值的DataTrigger

15

这是我试图在简要概括下的做法,我将从代码开始,很可能会让人感到意义不明。

<bl:InnerGlowBorder x:Name="glow"
                    InnerGlowColor="Teal">
  <bl:InnerGlowBorder.Style>
    <Style TargetType="bl:InnerGlowBorder">
      <Style.Triggers>
        <DataTrigger Binding="{Binding ViewUnitStatus}"
                     Value="UnitStatusModel.Pass">
          <Setter Property="InnerGlowColor"
                  Value="Green" />
        </DataTrigger>
        <DataTrigger Binding="{Binding ViewUnitStatus}"
                     Value="UnitStatusModel.Fail">
          <Setter Property="InnerGlowColor"
                  Value="Red" />
        </DataTrigger>
        <DataTrigger Binding="{Binding ViewUnitStatus}"
                     Value="UnitStatusModel.Indeterminate">
          <Setter Property="InnerGlowColor"
                  Value="Yellow" />
        </DataTrigger>
        <DataTrigger Binding="{Binding ViewUnitStatus}"
                     Value="UnitStatusModel.Warning">
          <Setter Property="InnerGlowColor"
                  Value="Orange" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </bl:InnerGlowBorder.Style>
</bl:InnerGlowBorder>

枚举定义如下:

namespace SEL.MfgTestDev.ESS.ViewModel
{
    public enum UnitStatusModel
    {
        Indeterminate,
        Pass,
        Fail,
        Warning,
    }
}

我是否缺少某个组件使这个工作?我在找一些关于WPF枚举的文章,它们依赖于对象数据源,但我并不喜欢那种解决方案,有没有更简单的方法在这里做到这一点?


2
InnerGlowColor="Teal"。问题在于,如果样式设置的字段在基类中被覆盖,则触发器不会改变任何内容。 - Firoso
+1 我正要回复这个问题。发表你自己的答案,然后接受它。 :) - Zach Bonham
1个回答

9
我已经找到了解决方案,而且很傻。样式被设计为控件的一种视觉模板,但它们是作为视觉实现的基础而设计的,而不是作为一个完美的视觉模型。因此,我遇到了这样一种情况:我的模板规定了InnerGlowColor应该是什么颜色。然而,通过将属性InnerGlowColor="Teal"应用于元素,我实际上创建了一个覆盖,忽略了我的视觉样式。解决方案就是简单地在元素声明中删除依赖属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接