如何将带有标志值的多个枚举传递给 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>
此处存在部分答案:
针对有经验的开发人员的附加信息:这与 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>