WPF: Как заполнить комбинированный список перечислениями в Xaml - PullRequest
1 голос
/ 11 марта 2011

Я знаю, что есть несколько способов сделать это, но я хотел бы сделать это еще проще, если это возможно, потому что у меня есть много комбинированных списков, которые можно связать таким образом. Есть предложение с использованием ObjectDataProvider здесь . Проблема в том, что я должен создать запись ресурса для каждого перечисления, и это много. До сих пор я использовал метод code-behind, потому что он намного короче:

cmb.ItemsSource = Enum.GetValues(typeof(MyTypes));

Мне интересно, можно ли создать эквивалент в Xaml. Я думал, что мы можем заархивировать это с помощью конвертера. Мы могли бы преобразовать тип в массив, а затем связать массив со списком элементов ItemsSource. Но я застрял на том, как указать мой enum для конвертера. Вот мой код:

Мое перечисление:

public enum MyTypes { Type1, Type2, Type3 }; 

Это мой конвертер:

public class EnumToArrayConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Enum.GetValues(value.GetType());
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null; // I don't care about this
    }
}

Мой ресурс Xaml:

<lib:EnumToArrayConverter x:Key="E2A"/>

Вот как это использовать:

<ComboBox SelectedItem="{Binding MyType}" ItemsSource="{Binding MyTypes, Converter={StaticResource E2A}}"/>

Итак, мой вопрос заключается в том, как указать мой enum "MyTypes" для конвертера. Я также попытался добавить пространство имен, но это не помогает.

Ответы [ 2 ]

5 голосов
/ 11 марта 2011

Вы бы лучше с MarkupExtension , как этот .

3 голосов
/ 11 марта 2011

CodeNaked публикует отличный способ сделать это

Для вашего подхода к работе вы можете изменить конвертер на Enum.GetValues(value as Type) и использовать синтаксис x:Type в качестве источника для привязки

ItemsSource="{Binding Source={x:Type local:MyValues},
                      Converter={StaticResource EnumToArrayConverter}}"

EnumToArrayConverter

public class EnumToArrayConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Enum.GetValues(value as Type);
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null; // I don't care about this
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...