如何将带有标志值的多个枚举传递给 XAML 值并仍然保持编译时类型检查

How to pass multiple enum with flags values to a XAML value and still keeping compile time type checking

此处存在部分答案: 其中建议的解决方案确实放松了编译时类型检查,因为它使用字符串值而不是真正的枚举值。这可能会导致运行时出错。

针对有经验的开发人员的附加信息:这与 nameof 存在之前的 INotifyPropertyChange 或用于替代 soso 替代方案的 lamda 存在多年的问题相同。

实际上我们可以传递一个枚举参数:ConverterParameter={x:Static module:MyEnum.MyEnumValue} 并且仍然保持编译时类型检查。

但是如何在 XAML 中对带有标志值的多个枚举进行编译时类型检查?

我想做的事情的例子:

<MultiDataTrigger.Conditions>
    <Condition Binding="{Binding Path=Item.SimulationNatureType}" 
        Value="{x:Static core:SimulationNatureType.TimeDomain | x:Static core:SimulationNatureType.FrequencyScan}">
    </Condition>
...

同时

<MultiDataTrigger.Conditions>
    <Condition ... Value="TimeDomain,FrequencyScan">
    </Condition>
</MultiDataTrigger.Conditions>

只需将字符串传递给条件的值,以下应该有效:

<MultiDataTrigger.Conditions>
    <Condition ...>
        <Condition.Value>
            <core:SimulationNatureType>TimeDomain,FrequencyScan</core:SimulationNatureType>
        </Condition.Value>
    </Condition>
</MultiDataTrigger.Conditions>

作为附加信息,这就是答案对我如此有用的原因:

(我知道我的通用转换器不好...抱歉...1=true,2=false,4=null)

<Style TargetType="Image" x:Key="ImageStyleForSimulatedInfoSimulationValues">
            <Style.Setters>
                <Setter Property="Source" Value="pack://application:,,,/WpfUtil;component/Images/NotApplicable16x16.png"></Setter>
            </Style.Setters>

            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Value="True">
                            <Condition.Binding>
                                <Binding Path="Item.SimulationNatureType" Converter="{StaticResource EnumWithFlagsHavingSomeSpecificFlagSetToBoolean}">
                                    <Binding.ConverterParameter>
                                        <core:SimulationNatureType>TimeDomain, FrequencyScan</core:SimulationNatureType>
                                    </Binding.ConverterParameter>
                                </Binding>
                            </Condition.Binding>
                        </Condition>
                        <Condition Value="True" Binding="{Binding Path=Item.IsValidForValues, ConverterParameter=1,
                                                Converter={StaticResource NullableBooleanToBooleanUniversalConverter}}">
                        </Condition>
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Source" Value="pack://application:,,,/WpfUtil;component/Images/OkSmall16x16.png" />
                </MultiDataTrigger>

                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Value="True">
                            <Condition.Binding>
                                <Binding Path="Item.SimulationNatureType" Converter="{StaticResource EnumWithFlagsHavingSomeSpecificFlagSetToBoolean}">
                                    <Binding.ConverterParameter>
                                        <core:SimulationNatureType>TimeDomain, FrequencyScan</core:SimulationNatureType>
                                    </Binding.ConverterParameter>
                                </Binding>
                            </Condition.Binding>
                        </Condition>
                        <Condition Value="True" Binding="{Binding Path=Item.IsValidForValues, ConverterParameter=6,
                                                Converter={StaticResource NullableBooleanToBooleanUniversalConverter}}">
                        </Condition>
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Source" Value="pack://application:,,,/WpfUtil;component/Images/Warning16x16.png" />
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>