Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

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

Читайте также:
  1. C. Обходной илеотрансверзоанастомоз, потому что при данных обстоятельствах является наиболее оправданным
  2. Oslash; 1.3. Принципы обмена данными между Windows-программами
  3. Windows позволяет производить обмен данными как внутри одного приложения, так и между различными приложениями.
  4. Анализ уровня и динамики финансовых результатов по данным отчетности
  5. Возвращение Семени для восстановления мозга; - Подъем Водяного Колеса; - Смешивание Дракона и Тигра; - Втягивание свинца и добавление ртути; - Возвращение к детству.
  6. ГЛАВА 12. АНАЛИЗ И ОЦЕНКА СОБСТВЕННОГО КАПИТАЛА ПО ДАННЫМ ОТЧЕТА ОБ ИЗМЕНЕНИЯХ КАПИТАЛА
  7. Для позиций в локальной смете добавлена возможность указывать гиперссылки, а также ссылки на любые внешние источники с данными

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

Класс 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 | Нарушение авторских прав


Читайте в этой же книге: Набор для практики | Задача 4. | Свойство, которое возвращает или задает тип, для которого предназначен данный стиль. | Шаг 2. Создание пользовательского элемента управления | Шаг 5. Использование Custom Control | Шаг 1. Инкапсуляция UI в User Control | Композиция элементов | Слабая связь | События | Команды |
<== предыдущая страница | следующая страница ==>
Команды и привязка к данным| Добавление триггеров к элементам управления

mybiblioteka.su - 2015-2024 год. (0.007 сек.)