在Silverlight ComboBox中过滤枚举

时间:2012-07-31 18:44:00

标签: silverlight data-binding combobox enums

我有一个代表可能配置的枚举。 (以下只是一个例子......)

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只会强制执行一个标志。

1 个答案:

答案 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作为简单的字符串过滤器,仅显示MinimalStandard选项。

如果你需要更有活力的东西,就这么说吧。你不能绑定ConverterParameters(不幸的是)所以它需要更多的工作。

动态属性解决方案

要使用AvailableConfigs属性执行相同的操作,您需要实现MultiBinding解决方案(允许您绑定到多个属性)。

绑定的顺序很重要,因为它将是传递给转换器的顺序。

e.g。

<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解决方案: