Страницы

воскресенье, 2 июня 2013 г.

Использование enum в XAML

К сожалению, WPF, в штатной поставке, имеет ограниченные возможности для работы с enum значениями, т.е. он может просто отобразить имя enum значения. Для решения данной проблемы воспользуемся знаниями о ValueConverter и набором extension методов для enum.


Задача
Разработать набор ValueConverter позволяющих отображать enum (не flag) в читаемом виде и выбирать значение enum из списка допустимых значений.

Реализация
Создадим простейшее тестовой WPF приложение, к которому подключим ранее реализованные enum extension методы.
Пока функциональность получилась не очень хорошая, в Label выводится символьное наименование значения enum, а ComboBox пустой

Создаем ValueCoverter для получения DisplayName и Description
И подключаем их к Binding выражению для Label и Label.ToolTip
Результат уже лучше, и мы получаем, то, что хотели.

Теперь перейдем к ComboBox, для начала создадим ValueConverter создающим набор DisplayName для всех допустимых значений enum Теперь список значений ComboBox не пустой и заполнен нужными данными


Осталось создать ValueCoverter для выбранного элемента списка, тут все просто, т.к. базовый тип данных для данного enum - int, то создаем конвертер Enum в int
И подключаем его к binding выражению, дополнительно заменив SelectedItem на SelectedValue
Все, задача решена



Но попробуем улучшить функциональность конвертера для получения списка значений DisplayName, а именно добавим возможность сортировки выводимого списка, для этого создадим enum описывающий допустимые направления сортировки
Изменим EnumToDisplayNamesConverter, добавив в него property SortDirection, и учитывая его при возврате результата
Обращаю внимание, что переменная _converter больше не static, т.к. у нас появились свойства для конкретного объекта конвертера. И объект создаваемый в ProvideValue создается с использованием значения property SortDirection
И подключим обратную сортировку в ComboBox
Результат

В принципе, наверно и все, дальше это можно развивать и доделывать. Вполне возможно, что, решение неидеальное, но свою функцию выполняет. Полный solution для Visual Studio 2012 тут.

Комментариев нет :

Отправить комментарий