我有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>
答案 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>