ComboBox с перечислением и нулевым значением - PullRequest
0 голосов
/ 25 марта 2020

У меня есть ComboBox, который заполняется из значений перечисления:

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

, который использует utils:Enumerate, класс расширения, чтобы получить значения перечисления

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.

Но я хочу, чтобы у comboxbox было другое значение - пустое. Поэтому я не могу выбрать ни одно из значений перечисления и отменить выбор ранее выбранных значений.

Как?

1 Ответ

1 голос
/ 25 марта 2020

Вы можете установить 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>

Заменить System.Runtime на mscorlib в объявлении пространства имен, если вы нацелены на. NET Framework.

Или вы можете добавить еще один string к string[], возвращенному вашим методом ProvideValue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...