пятница, 9 декабря 2011 г.

Использование конвертеров значений в привязках данных WPF

Связывание данных (Data Binding) в WPF – очень мощный (правда, не всегда удобный) механизм. А возможность использование конвертеров дает возможность связывать интерфейс с данными почти любого вида. Несмотря на кажущуюся простоту явления, возможности, открываемые конвертерами, поистине безграничны.

Если просто почитать документацию, то конвертер – это просто способ преобразования данных из одного формата в другой. Однако, если посмотреть немного шире, то можно заметить, что конвертер – это некоторая функция, результат вычисления которой может быть помещен в свойство зависимостей (DependencyProperty) любого элемента. Множественное связывание данных (MultiBinding) позволяет передавать в функцию несколько аргументов. В качестве аргументов множественной привязки могут выступать привязки в значениям свойств зависимостей, которые тоже могут быть получены с помощью конвертеров.

image

Динамическое создание модели представления

Это дает возможность в некоторых случаях вообще обходиться без явно выраженной модели представления, конструируя её на лету из конвертеров. Более интересный способ – конструирование модели представления (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, то, возможно, вам также будет интересно:


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

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