Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Windows Presentation Foundation.docx
Скачиваний:
43
Добавлен:
02.11.2018
Размер:
1.15 Mб
Скачать

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

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

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

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

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

  3. Реализовать метод Convert(), преобразующий данные из исходного формата в отображаемый формат.

  4. Реализовать метод ConvertBack(), выполняющий обратное преобразование значения из отображаемого формата в его «родной» формат.

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

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

public class BoolToColorConverter : IValueConverter

{

public object Convert(object value, Type targetType,

object parameter, CultureInfo culture)

{

return (bool)value ? Brushes.Blue : Brushes.Green;

}

public object ConvertBack(object value, Type targetType,

object parameter,

CultureInfo culture)

{

return null; // ожидаем, что привязка однонаправленная

}

}

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

<Window x:Class="WpfApplication.MainWindow"

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

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

xmlns:Converters="clr-namespace:WpfApplication">

<Window.Resources>

<Converters:BoolToColorConverter x:Key="BoolToColor"/>

</Window.Resources>

<TextBlock Foreground="{Binding,

Converter={StaticResource BoolToColor}}"/>

</Window>

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

  • Использовать привязку MultiBinding вместо обычного объекта Binding;

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

MultiBinding группирует последовательность объектов Binding. Ниже приведен пример, где MultiBinding использует два свойства в объекте данных:

<TextBox>

<TextBox.Text>

<MultiBinding Converter="{StaticResource ValueInStockConverter}">

<Binding Path="UnitCost" />

<Binding Path="UnitsInStock" />

</MultiBinding>

</TextBox.Text>

</TextBox>

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