【问题标题】:Property trigger bound to flag enum绑定到标志枚举的属性触发器
【发布时间】:2015-01-14 15:00:49
【问题描述】:

我有 DependencyProperty State of Flags 枚举类型。由于 State 属性的更改,我想更改某些元素边框颜色。由于某些原因,我不能直接对元素进行操作,只能通过设置其样式来操作。

如何更改以下代码,使其可以不检查 State 的确切值,而是检查它是否包含所需的标志?

<Style.Triggers>
            <Trigger Property="State" Value="None">
                <Setter Property="StateBorderBrush" Value="Transparent"/>
            </Trigger>
            <Trigger Property="State" Value="Covered">
                <Setter Property="StateBorderBrush" Value="Blue"/>
            </Trigger>
            <Trigger Property="State" Value="Selected">
                <Setter Property="StateBorderBrush" Value="Red"/>
            </Trigger>
            <Trigger Property="State" Value="contains flag 'Controlled'">
                <Setter Property="StateBorderBrush" Value="Orange"/>
            </Trigger>
        </Style.Triggers>

【问题讨论】:

  • 您可以使用转换器来检查值,否则xaml 在使用比较时提供有限的功能,即它只能检查相等和相等,因此Converter 将是最简单的选择。这是linkHTH
  • 转换器应该放在哪里? Trigger 的 Property 和 Value 都不能接受绑定作为值。

标签: wpf enums triggers flags wpf-style


【解决方案1】:

就我而言,唯一的解决方案是转换器:

 public class EnumFlagConverter : ValueConverter
{
    public string FlagValue { get; set; }
    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Enum en = value as Enum;
        var enumFlag = Enum.Parse((Type)parameter, FlagValue);
        return en.HasFlag((Enum)enumFlag);
    }
}

还有xaml绑定:

 <DataTrigger Binding="{Binding State,Converter={cnv:EnumFlagConverter FlagValue='Locked'}, ConverterParameter={x:Type viewModels:SourceControlState}}"
                         Value="True">
                <Setter Property="Source"
                        TargetName="srcCtrlStatusIndicator"
                        Value="{StaticResource ImageSourceCheckedOutBySomeoneElse9x9}" />                  

            </DataTrigger>

【讨论】:

    【解决方案2】:

    在此处查看 Lars 对类似问题的一般回答:Using a generic converter

    他的解决方案适用于不互斥的枚举标志。这让我可以使用这个 XAML。

    <DataTrigger Binding="{Binding Path=State, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static enums:MyStatesEnum.MyEnumFlagValue}}" Value="True">
                    <Setter Property="BorderBrush" Value="Red"/>
                </DataTrigger>
    

    【讨论】:

      【解决方案3】:

      最后我通过使用 DataTrigger 与 Self 的相对绑定来实现它:

      <DataTrigger Binding="{Binding Path=State, RelativeSource={RelativeSource Self}}" Value="None">
            <Setter Property="StateBorderBrush" Value="Transparent"/>
      </DataTrigger>
      

      那么就可以展开Binding元素并应用合适的转换器

      【讨论】:

        【解决方案4】:

        这是您在触发器中测试枚举的方式:

            <ControlTemplate.Triggers>
                <Trigger Property="ViewState"
                         Value="{x:Static constants:LicenseViewState.License}">
                    <Setter Property="Visibility"
                            Value="Collapsed"
                            TargetName="ProductComboBoxField">
                    </Setter>
                </Trigger>
            </ControlTemplate.Triggers>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-05
          相关资源
          最近更新 更多