Совершенствуем xaml: Bindable Converters, Switch Converter, Sets
Нужно признать, xaml-код бывает отчасти многословным, что вызывает иногда некоторый дискомфорт при разработке. В статье рассмотрим оптимизации, которые помогут существенно улучшить организацию разметки и сделать её более читаемой. Особенно это касается работы с конвертерами, которые неотъемлемо связаны с механизмом привязки данных.Нам понадобятся некоторые знания из прошлых статей, в частности, понимание принципа прямых инжекций.Bindable Converters
Рано или поздно многие xaml-разработчики сталкивается с вопросом, возможно ли создать конвертер, поддерживающий привязку каких-либо параметров? Но даже если помимо реализации интерфейса IValueConverter, произвести наследование от класса DependencyObject и объявить в конвертере DependencyProperty, то привязка работать в большинстве случаев не станет, поскольку конвертер не является элементом визуального дерева! Конечно, возможно пойти ещё дальше и создать гибрид контрола-конвертера, незаметно помещаемого на представление, но такое экзотическое решения вряд ли можно назвать красивым, да и спектр его применения ограничен.
Но на выручку приходит принцип прямых инжекций, ведь ничто не мешает применить StoreBinding к Dependency Converter.
Часто в больших проектах приходится создавать много различных однотипных классов-конвертеров, логика которых очень напоминает поведение операторов if-else и switch, например, для различных перечислений (Enums). Но на самом деле, в таких случаях достаточно ограничиться применением универсального Switch Converter:
После чего необходимо прямо или косвенно смержить этот словарь с ресурсами в App.xaml, что позволит использовать основные конвертеры практически в любых xaml-файлах приложения без дополнительных действий. Такое добавление в глобальные ресурсы приложения полезно производить для любых более-менее общих вещей: цветов, кистей, шаблонов и стилей, — что помогает очень просто реализовать, к примеру, механизмы смены тем в приложении.
public class Set: ObservableCollection
Надеюсь, что все эти статьи интересны и полезны разработчикам. Особенно хочется отметить взаимную согласованность предложенных концепций между собой, они как бы дополняют и усиливают друг друга. Думаю, что те люди, которые изучат материалы достаточно хорошо, смогут применить их в работе и оценить по достоинству.
Глупо скрывать эти знания или брать за них плату, поскольку даже воспринять и осознать их оказывается не так просто. Возможно, через некоторое время кто-то поймёт, как много ресурсов помогли сохранить эти простые по своей форме советы, и захочет поблагодарить создателя библиотеки Aero Framework, потому реквизиты для пожертвований доступны на этой странице. Быть может, некоторые даже пожелают ещё более углубиться в изучение и приобрести исходные коды реальных проектов (конечно, для индивидуальных разработчиков их стоимость может показаться ощутимой, но для компаний это символическая плата).
Поэтому, даже если вы пользуетесь библиотекой бесплатно, то, пожалуйста, рекомендуйте её своим коллегам, друзья и всем тем, кто в теме! Спасибо!