ComboBox типов с ValueConverter и пользовательскими атрибутами - PullRequest
3 голосов
/ 13 ноября 2010

Я использую MVVM, на случай, если что-то изменится.

My MainWindowViewModel имеет два свойства DependencyProperties, TheList и TheSelectedItem , TheList представляет собой Список , TheSelectedItem представляет собой Тип .

Основное окно имеет ComboBox .Когда MainWindowViewModel загружается, он получает список всех классов в сборке, которые реализуют IMyInterface , и устанавливает TheList на это.

Каждый из этих классов имеет свой собственный атрибут под названием DisplayName , который имеет один параметр, который будет использоваться для отображения понятного имени для класса вместо имени, которое знает приложениео классе.

У меня также есть ValueConverter для явной цели преобразования этих типов в отображаемые имена.

    public class TypeToDisplayName : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (targetType.Name == "IEnumerable")
            {
                List<string> returnList = new List<string>();
                if (value is List<Type>)
                {
                    foreach (Type t in value as List<Type>)
                    {
                        returnList.Add(ReflectionHelper.GetDisplayName(t));
                    }
                }

                return returnList;
            }
            else
            {
                throw new NotSupportedException();
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return typeof(BasicTemplate);
        }
    }

Итак, что яЗавершить это - ComboBox со списком имен в нем, который должен уметь понимать пользователь.Потрясающие!Это именно то, что я хочу!

Следующий шаг: я связываю свойство SelectedItem моего ComboBox со своим TheSelectedItem в моей ViewModel.

Вот проблема: Когда я делаюПри выделении я получаю маленькую красную рамку вокруг моего ComboBox, и свойство TheSelectedItem в моей ViewModel никогда не устанавливается.

Я почти уверен, что это из-за несоответствия типов (элементы в ComboBox теперь выглядят как строки, и TheSelectedItem имеет тип Тип - также, когда я изменяю TheSelectedItem на строку вместо Type , это работает).Но я не знаю, где мне нужно начинать кодирование для преобразования (надеюсь уникального) DisplayName, которое находится в ComboBox, обратно в объект Type.

Заранее благодарен за любую помощь.Я довольно озадачен этим.

Ответы [ 2 ]

9 голосов
/ 13 ноября 2010

Если я правильно понимаю ваш вопрос, то используете ли вы этот конвертер в ItemsSource для ComboBox?В этом случае я думаю, что вы можете позволить ItemSource быть таким, какой он есть, и вместо этого просто конвертировать каждый тип, когда они представлены следующим образом.

<ComboBox ...>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=typeName, Converter={StaticResource TypeToDisplayNameConverter}}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

А затем просто конвертировать каждый тип в конвертере.

public class TypeToDisplayNameConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Type t = (Type)value;
        return ReflectionHelper.GetDisplayName(t);
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }
}
1 голос
/ 13 ноября 2010

Убедитесь, что у IsSynchronizedWithCurrentItem установлено значение true на ComboBox.Проверьте это из ...

...