Страницы

Поиск по вопросам

среда, 17 октября 2018 г.

Зачем усложнять жизнь… Converter в Binding

Здравствуйте, скажите пожалуйста зачем и в чём удобства Converter'а в Binding'е?


Ответ

Конвертеры нужны, чтобы не выносить в VM логику представления. VM, например, не должна хотеть знать ширину колонки таблицы, текущий язык, выбранный скин приложения и тому подобные чисто вьюшные подробности. Вот для перевода VM-объектов во вьюшный вид и нужны конвертеры.
Примеры.
У вас есть VM-объект, означающий дату. Его тип, понятно, DateTime. А в UI вы хотите показывать его в виде «сегодня», «вчера», «неделю назад», «1 апреля» или как-то ещё. Перевод в такую нотацию — хорошее место для конвертера.
Вам нужно вывести «15 экземпляров», но если колонка слишком узкая, то нужно сократить текст до «15 экз.». Заниматься размерами колонок — не дело VM, напишите для этого конвертер.
В VM у вас язык сообщения, а во View вы решили показывать его в виде флажка нужной страны. Конвертация CultureInfo в pack URI к вашему графическому ресурсу — не задача VM, оставьте это конвертеру. VM вообще не знает ничего о графических ресурсах.
В VM некоторые данные иногда отсутствуют (значение свойства равно null), и вы не хотите показывать рамку с красивым фоном для пустых данных. Превратить null в Visibility.Collapsed — конвертер и только он.
У вас есть клетка игровой доски, и вам нужно выяснить её координаты. (Предположим, что ваши клетки не квадратные, и в грид автоматически не укладываются.) Размер клетки зависит от размера окна, количества клеток и ещё каких-то чисто визуальных подробностей. Кто будет пересчитывать координаты? VM? Фигушки, эту задачу должен решать конвертер.
У вас есть кастомный прогрессбар, он не линейный, а круглый. Кто-то должен пересчитать положение прогрессбара в угол. VM? Нет, VM ничего не знает о стиле, который вы дали прогрессбару. А выставлять свойства для круглого, квадратного и семиугольного прогрессбаров совсем несемантично. Поэтому пусть стиль прогрессбара пользуется конвертером.
Вам нужно привязать ширину одного контрола, чтобы она равнялась удвоенной ширине другого контрола. Кто будет умножать на два? Выносить задачу в VM через 18 привязок? Просто добавьте конвертер.
В общем, для конвертеров найдётся много задач чисто визуального характера.

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

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