Главная » WPF » Триггеры

0

В главе 5 мы впервые познакомились с триггерами,  когда воспользовались ими  в сочетании  с шаблоном  элемента  управления для  декларативного за пуска анимации.  Триггер может сработать по одному из трех условий: (1) из менение  состояния свойства  отображения (Trigger);  (2)  изменение  состоя ние свойства данных (DataTrigger); (3) событие (EventTrigger). Все три типа триггеров при срабатывании запускают некоторую последовательность действий.  Существует  также два типа триггеров  для наборов: MultiTrigger и MultiDataTrigger.

Триггерами можно пользоваться только внутри шаблона или стиля5. Объекты Trigger и EventTrigger допустимы внутри шаблона элемента управления или сти ля, а объекты DataTrigger – только внутри шаблона данных.

Добавление триггеров к данным

В шаблоне данных есть два способа связать элемент отображения с частью мо дели данных. Мы уже видели, как это можно сделать с помощью привязки, при чем дополнительно можно  еще воспользоваться конвертером  для  преобразова ния значения  из модели данных в нечто понятное элементам отображения.

Класс DataTrigger дает декларативный способ задать действия,  которые сле дует выполнить для указанных  значений  из модели данных. Тем самым DataTrigger – это, по сути  дела, простой  конвертер  значений,  определенный в разметке. С помощью привязки он получает значение  из модели данных, а когда это значение соответствует заранее заданному, использует последовательность объектов Setter и EventSetter.

Для демонстрации возьмем последний пример из раздела, посвященного командам  (рис. 7.6), и переделаем  конвертер  значений  в DataTrigger. Вместо того чтобы пользоваться конвертером  в привязке к свойству  кнопки Command, мы привяжем  к нему значение по умолчанию (в данном случае BlockedCommand):

<DataTemplate>

<WrapPanel>

<TextBlock Text=’{Binding Path=Name}’ />

Рис. 7.7. Применение DataTrigger вместо конвертера значений и установка сразу нескольких свойств

Поскольку DataTrigger может содержать более одного объекта Setter,  то легко организовать выполнение нескольких  действий, когда элемент данных примет интересующее нас значение. Добавим для примера еще один объект, который бу дет показывать  подлежащую  выполнению команду (рис. 7.7). Определенный по рядок вызова установщиков не гарантируется, хотя в текущей версии они приме няются в порядке объявления.

<DataTemplate>

<WrapPanel>

<TextBlock Text=’{Binding Path=Name}’ />

<Button x:Name=’_showButton’

Command=’{x:Static l:DataAndTriggers.BlockedCommand}’ CommandParameter=’{Binding Path=FullName}’

Content=’Block’

/>

</WrapPanel>

<DataTemplate.Triggers>

<DataTrigger Binding=’{Binding Path=Extension}’ Value=’.txt’>

<Setter TargetName=’_showButton’ Property=’Command’

Value=’{x:Static l:DataAndTriggers.OpenCommand}’ />

<Setter TargetName=’_showButton’ Property=’Content’ Value=’Show’ />

</DataTrigger>

</DataTemplate.Triggers>

</DataTemplate>

При работе с классом  DataTrigger мы можем только сравнивать  значения  на равенство.  Предыдущий пример  отличается  от варианта  с использованием кон вертера значений в одной существенной детали: в первоначальной версии для об

работки  возможных  различий в регистре  букв в имени файла  вызывался метод ToLowerInvariant. Чтобы сохранить эту возможность,  мы можем создать простой конвертер  значений  для приведения к нижнему регистру:

public class ToLowerInvariantConverter : IValueConverter {

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {

return ((string)value).ToLowerInvariant();

}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {

return value;

}

}

Подключить конвертер  к триггеру очень просто:

<DataTrigger Value=’.txt’>

<DataTrigger.Binding>

<Binding Path=’Extension’>

<Binding.Converter>

<l:ToLowerInvariantConverter />

</Binding.Converter>

</Binding>

</DataTrigger.Binding>

<Setter TargetName=’_showButton’ Property=’Command’

Value=’{x:Static l:DataAndTriggers.OpenCommand}’ />

<Setter TargetName=’_showButton’ Property=’Content’ Value=’Show’ />

</DataTrigger>

С помощью  DataTrigger мы можем  перенести  всю зависящую  от пользова тельского интерфейса логику (привязку нужной команды)  в разметку, оставив в коде лишь самый минимум  (преобразование строк).  Перенос  логики  в разметку упрощает создание качественных  инструментов для отображения и четко отделя ет интерфейс от логики приложения.

Источник: К. Андерсон  Основы  Windows Presentation Foundation. Пер. с англ. А. Слинкина — М.: ДМК Пресс, 2008 — 432 с.: ил.

По теме:

  • Комментарии