我有一个代表可能配置的枚举。 (以下只是一个例子......)
public enum ConfigurationType {
[Description("Minimal Configuration")]
Minimal = 0,
[Description("Standard Configuration")]
Standard,
[Description("Premium Configuration")]
Premium
}
现在我正在使用值转换器(找到here)将类中ConfigurationType
类型的属性绑定到ComboBox以显示描述。这很好。然而,我想要做的是能够动态禁用特定枚举成员的选择,结果是它们不会出现在ComboBox中。
我已经尝试将此枚举转换为标记枚举,然后绑定到一组标志,但没有走得太远。关于那个或其他建议的任何指示?
编辑 - 标记示例
尝试使用标志时,我将枚举更改为:
[Flags]
public enum ConfigurationType {
[Description("Minimal Configuration")]
Minimal = 1 << 0,
[Description("Standard Configuration")]
Standard = 1 << 1,
[Description("Premium Configuration")]
Premium = 1 << 2
}
public ConfigurationType AvailableConfigs = ConfigurationType.Standard | ConfigurationType.Premium;
它实际上可以将这些按位或者这些列表分配给一个变量,例如AvailableConfigs(如上所示),但是值转换器部分就是挂起。我不知道如何实现一个值转换器来获取AvailableConfigs中存在的每个标志的描述,并且能够转换回一个变量(也是ConfigurationType),例如SelectedConfiguration。当然,SelectedConfiguration的setter只会强制执行一个标志。
答案 0 :(得分:1)
如果您可以在XAML中定义可用选项,则可以执行以下操作:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return null;
else
{
if (string.IsNullOrEmpty((string)parameter))
{
return EnumValueCache.GetValues(value.GetType());
}
return EnumValueCache.GetValues(value.GetType()).Where(x => parameter.ToString().Contains(x.ToString()));
}
}
使用像这样的ConverterParameter绑定:
<ComboBox Height="23" HorizontalAlignment="Left" Margin="25,27,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120"
ItemsSource="{Binding MyEnumProperty, Converter={StaticResource enumConverter}, ConverterParameter=Minimal-Standard}"
SelectedItem="{Binding MyEnumProperty, Mode=TwoWay}"/>
使用ConverterParameter作为简单的字符串过滤器,仅显示Minimal
和Standard
选项。
如果你需要更有活力的东西,就这么说吧。你不能绑定ConverterParameters(不幸的是)所以它需要更多的工作。
要使用AvailableConfigs
属性执行相同的操作,您需要实现MultiBinding解决方案(允许您绑定到多个属性)。
绑定的顺序很重要,因为它将是传递给转换器的顺序。
<ComboBox Height="23" HorizontalAlignment="Left" Margin="25,27,0,0" Name="comboBox2" VerticalAlignment="Top" Width="120" >
<ComboBox.ItemsSource>
<MultiBinding Converter="{StaticResource enumConverter}">
<Binding Path="MyEnumProperty" />
<Binding Path="AvailableConfigs" />
</MultiBinding>
</ComboBox.ItemsSource>
</ComboBox>
MultiBinding只是WPF的一部分,而不是Silverlight的一部分,所以这里有一些Silverlight MultiBinding解决方案: