2

私は 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>
4

4 に答える 4

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>
于 2016-07-10T12:18:09.463 に答える
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>
于 2015-04-15T02:15:41.377 に答える
0

最後に、自己への相対バインディングで DataTrigger を使用してそれを達成しました。

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

次に、バインディング要素を展開し、適切なコンバーターを適用することができます

于 2015-01-15T07:01:00.997 に答える