Конвертеры значений

Конвертер значений отвечает за преобразование данных при переносе из источника в целевое свойство и за обратное преобразование в случае двунаправленной привязки.

Для создания конвертера значений требуется выполнить четыре шага.

1. Создать класс, реализующий интерфейс IValueConverter.

2. Применить к классу атрибут [ValueConversion] и специфицировать исходный и целевой типы данных (необязательный шаг).

3. Реализовать метод Convert(), выполняющий преобразование данных от источника к целевому объекту.

4. Реализовать метод ConvertBack(), делающий обратное преобразование.

Приведём пример простого конвертера, преобразующего вещественное число в кисть WPF:

[ValueConversion(typeof (double), typeof (Brush))]

public class DoubleToColorConverter: IValueConverter

{

public object Convert(object value, Type targetType,

object parameter, CultureInfo culture)

{

return (double) value > 18? Brushes.Blue: Brushes.Red;

}

public object ConvertBack(object value, Type targetType,

object parameter, CultureInfo culture)

{

// это конвертер для однонаправленной привязки

return null;

}

}

Чтобы ввести в действие конвертер значений, нужно использовать свойство привязки Converter и, при необходимости, свойства ConverterParameter и ConverterCulture. Как несложно понять, значения последних двух свойств передаются методам конвертера в качестве аргументов.

Используем конвертер DoubleToColorConverter в примере привязки для объекта Person. Объект конвертера разместим в ресурсах окна. Предполагаем, что объект-источник присваивается свойству окна DataContext в коде:

<Window x:Class="WpfBinding.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:local="clr-namespace:WpfBinding"

Height="200" Width="400" Title="WPF Binding">

<Window.Resources>

<local:DoubleToColorConverter x:Key="dc" />

</Window.Resources>

<Grid Margin="10">

<!-- описание структуры Grid опущено для краткости -->

<TextBlock Grid.Column="0" Grid.Row="0" Text="Name" />

<TextBox Grid.Column="1" Grid.Row="0"

Text="{Binding Name, Mode=TwoWay}" />

<TextBlock Grid.Column="0" Grid.Row="1" Text="Age" />

<TextBox Grid.Column="1" Grid.Row="1"

Text="{Binding Age, Mode=TwoWay}"

Foreground="{Binding Age,

Converter={StaticResource dc}}" />

</Grid>

</Window>

В состав WPF входит ряд конвертеров для нескольких распространённых сценариев привязки. Один из них называется BooleanToVisibilityConverter и преобразует перечисление Visibility в тип bool?.

С помощью конвертеров значений можно реализовать преобразование нескольких значений для создания единственного конвертированного значения. Для этого необходимо:

1. Использовать привязку MultiBinding вместо Binding;

2. Создать конвертер, реализующий интерфейс IMultiValueConverter.

Класс MultiBinding схож с классом Binding – оба класса унаследованы от System.Windows.Data.BindingBase. Класс MultiBinding группирует привязки в коллекцию Bindings.

<!-- TextBlock будет показывать имя и возраст Person -->

<TextBlock>

<TextBlock.Text>

<MultiBinding StringFormat="{}{0} - {1}">

<Binding Path="Name" />

<Binding Path="Age" />

</MultiBinding>

</TextBlock.Text>

</TextBlock>

Как и IValueConverter, интерфейс IMultiValueConverter определяет методы Convert() и ConvertBack(). Отличие в том, что методам передаётся массив значений и массив типов вместо единственного значения и типа. Массивы значений и типов формируются на основе привязок в коллекции Bindings.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: