属性触发器绑定到标记枚举

时间:2015-01-14 15:00:49

标签: wpf enums triggers flags wpf-style

我有DependencyProperty标志状态枚举类型。由于更改了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>

4 个答案:

答案 0 :(得分:2)

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

 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>

答案 1 :(得分:1)

在此处查看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>

答案 2 :(得分:0)

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

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

然后可以扩展Binding元素并应用适当的转换器

答案 3 :(得分:0)

这是你在触发器中测试枚举的方法:

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