Связывание данных (Data Binding) в WPF – очень мощный (правда, не всегда удобный) механизм. А возможность использование конвертеров дает возможность связывать интерфейс с данными почти любого вида. Несмотря на кажущуюся простоту явления, возможности, открываемые конвертерами, поистине безграничны.
Если просто почитать документацию, то конвертер – это просто способ преобразования данных из одного формата в другой. Однако, если посмотреть немного шире, то можно заметить, что конвертер – это некоторая функция, результат вычисления которой может быть помещен в свойство зависимостей (DependencyProperty) любого элемента. Множественное связывание данных (MultiBinding) позволяет передавать в функцию несколько аргументов. В качестве аргументов множественной привязки могут выступать привязки в значениям свойств зависимостей, которые тоже могут быть получены с помощью конвертеров.
Динамическое создание модели представления
Это дает возможность в некоторых случаях вообще обходиться без явно выраженной модели представления, конструируя её на лету из конвертеров. Более интересный способ – конструирование модели представления (ModelView) с помощью конвертера, например, задавая с его помощью DataContext:
<Grid.DataContext>
<MultiBinding Converter="{StaticResource LocalConverter}" ConverterParameter="MakeEmployeesGroupSummary">
<Binding />
<Binding Path="DataContext.Problems" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}"/>
</MultiBinding>
</Grid.DataContext>
Динамическое формирование содержимого
<diag:WorkloadDiagramContent.Content>
<MultiBinding Converter="{StaticResource BandConverter}" ConverterParameter="GetWorkloadContent">
<Binding Path="Data" RelativeSource="{RelativeSource Mode=Self}" />
<Binding ElementName="userControl"/>
<Binding Path="Visibility" ElementName="userControl"/>
<Binding Path="Height" ElementName="border"/>
<Binding Path="WorkloadColorConverter" ElementName="userControl"/>
<Binding Path="WorkerToolTipConverter" ElementName="userControl"/>
<Binding Path="Item" RelativeSource="{RelativeSource Mode=Self}" />
<Binding Path="Item.IsExpanded" RelativeSource="{RelativeSource Mode=Self}" />
</MultiBinding>
</diag:WorkloadDiagramContent.Content>
В результате работы такого конвертера создается, например, ContentControl, уже наполненный нужным содержанием. При изменении значений какого-то из параметров множественной привязки конвертер вызовется снова, и содержание элемента изменится. Такой подход можно применять когда сложно реализовать отображение данных с помощью шаблонов, например требуется отображать какую-то сложную графику.
Еще про конвертеры
Если вас заинтересовало использование конвертеров в WPF, то, возможно, вам также будет интересно:
Комментариев нет:
Отправить комментарий