具有枚举和空值的 ComboBox

ComboBox with enumeration and null value

我有一个 ComboBox 由枚举的值填充:

<ComboBox ItemsSource="{utils:Enumerate {x:Type models:MyEnum}}"
          SelectedItem="{Binding SelectedEnumValue, Converter={StaticResource EnumToStringConverter}}" />

使用 utils:Enumerate 的扩展 class 来获取枚举的值

public sealed class EnumerateExtension : MarkupExtension
{
    public Type Type { get; set; }
    public EnumerateExtension(Type type)
    {
        Type = type;
    }
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var names = Enum.GetNames(Type);
        string[] values = new string[names.Length];

        for (int i = 0; i < names.Length; i++)
        {
            values[i] = StringResources.Get(names[i]); //translating the enum value into a readable text
        }
        return values;
    }
}

效果很好,可以在组合框中显示枚举的所有可能值。它还包含漂亮的可读文本,而不是像 NotReleased.

这样的枚举值

但我希望组合框具有另一个值 - 一个空值。所以我可以 select none 枚举值和 deselect 以前 selected 值。

如何?

您可以将 ItemsSource 设置为 CompositeCollection,然后再向其添加另一个 string:

<ComboBox SelectedItem="...">
    <ComboBox.ItemsSource>
        <CompositeCollection xmlns:s="clr-namespace:System;assembly=System.Runtime">
            <s:String>(empty)</s:String>
            <CollectionContainer Collection="{Binding Source={utils:Enumerate {x:Type models:MyEnum}}}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

如果您以 .NET Framework 为目标,请在命名空间声明中将 System.Runtime 替换为 mscorlib

或者您可以向 ProvideValue 方法返回的 string[] 添加另一个 string