Читайте также:
|
|
В шаблоне данных есть два способа связать элемент отображения с частью модели данных. Мы уже видели, как это можно сделать с помощью привязки, причем дополнительно можно еще воспользоваться конвертером для преобразования значения из модели данных в нечто понятное элементам отображения.
Класс DataTrigger дает декларативный способ задать действия, которые следует выполнить для указанных значений из модели данных. Тем самым DataTrigger – это, по сути дела, простой конвертер значений, определенный в разметке. С помощью привязки он получает значение из модели данных, а когда это значение соответствует заранее заданному, использует последовательность объектов Setter и EventSetter.
Для демонстрации возьмем последний пример из раздела, посвященного командам, и переделаем конвертер значений в DataTrigger. Вместо того чтобы пользоваться конвертером в привязке к свойству кнопки Command, мы привяжем к нему значение по умолчанию (в данном случае BlockedCommand):
<DataTemplate>
<WrapPanel>
<TextBlock Text=’{Binding Path=Name}’ />
<Button Command=’{x:Static l:DataAndTriggers.BlockedCommand}’
CommandParameter=’{Binding Path=FullName}’>
Show
</Button>
</WrapPanel>
</DataTemplate>
Далее следует описать триггер данных, который будет срабатывать, когда файл имеет расширение «.txt»:
<DataTemplate>
<WrapPanel>
<TextBlock Text=’{Binding Path=Name}’ />
<Button Command=’{x:Static l:DataAndTriggers.BlockedCommand}’
CommandParameter=’{Binding Path=FullName}’>
Show
</Button>
</WrapPanel>
<DataTemplate.Triggers>
<DataTrigger Binding=’{Binding Path=Extension}’ Value=’.txt’/>
</DataTemplate.Triggers>
</DataTemplate>
Если расширение равно «.txt», то свойству Command должно быть присвоено значение OpenCommand. Для этого нужно включить в триггер объект Setter, который и запишет нужное значение в свойство. В данном случае нужно еще задать объект, которому принадлежит свойство, поскольку мы не хотим изменять свойства в модели данных:
<DataTemplate>
<WrapPanel>
<TextBlock Text=’{Binding Path=Name}’ />
<Button x:Name=’_showButton’
Command=’{x:Static l:DataAndTriggers.BlockedCommand}’
CommandParameter=’{Binding Path=FullName}’>
Show
</Button>
</WrapPanel>
<DataTemplate.Triggers>
<DataTrigger Binding=’{Binding Path=Extension}’ Value=’.txt’>
<Setter TargetName=’_showButton’ Property=’Command’
Value=’{x:Static l:DataAndTriggers.OpenCommand}’ />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
Поскольку DataTrigger может содержать более одного объекта Setter, то легко организовать выполнение нескольких действий, когда элемент данных примет интересующее нас значение. Добавим для примера еще один объект, который будет показывать подлежащую выполнению команду. Определенный порядок вызова установщиков не гарантируется, хотя в текущей версии они применяются в порядке объявления.
<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 мы можем перенести всю зависящую от пользовательского интерфейса логику (привязку нужной команды) в разметку, оставив в коде лишь самый минимум (преобразование строк). Перенос логики в разметку упрощает создание качественных инструментов для отображения и четко отделяет интерфейс от логики приложения.
Дата добавления: 2015-08-13; просмотров: 88 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Команды и привязка к данным | | | Добавление триггеров к элементам управления |