Подпишись на наш Twitter

Быть в курсе появления новых статей!

До текущего момента в серии примеров по Caliburn Micro мы рассмотрели как начать использовать Caliburn Micro в WPF приложении и как связать представление? с моделью вместе используя привязку и события. В сегодняшнем примере мы рассмотрим более продвинутые возможности обработки событий и указание параметров события. Для эксперимента с этими возможностями мы расширим приложение, сделанное в предыдущих статьях.

Возможно, вы помните по предыдущим статьям, что мы привязывались к событиям с помощью соглашений именования Caliburn Micro. Все что нам надо было это задать имя кнопки в представлении таким же, как и имя метода в модели представления. Когда событие Click происходило для кнопки, то это автоматически связывало его с вызовом соответствующего метода. Иногда вам нужно однозначно привязаться к событию для передачи параметров или указать какое точно событие вы хотите использовать. Для этого Caliburn Micro предоставляет расширенный и короткий синтаксис. Преимущество расширенного синтаксиса в совместимости с Microsoft Expression Blend. Короткий синтаксис лучше, если вам не нужно использовать дизайнер и вы хотите краткости и простоты. Давайте начнем с изучения как использовать расширенный синтаксис.

Расширенный синтаксис

Лучше сначала изменить существующее приложение для использования расширенного синтаксиса, без изменения текущего поведения. Откройте AppView.xaml и добавьте эти два пространства имен:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cal="http://www.caliburnproject.org"

Затем просто замените RepeatButton этой разметкой:


  
    
      
    
  

Запустите приложение и вы увидите, что все выглядит и имеет поведение точно такое же как и раньше. Мы использовали триггеры из System.Windows.Interactivity для связывания события и метода. В EventTrigger мы можем указать какое событие мы хотим слушать и используя Caliburn Micro ActionMessage мы можем указать какой метод должен быть вызван. Используя этот подход вы можете включить любое количество триггеров событий для прослушивания других событий в того же контрола.

Далее давайте взглянем на параметры события. Для демонстрации, мы добавим другую кнопку, которая будет увеличивать на 2. В AppViewModel.cs нам нужно изменить метод IncrementCount для передачи числового параметра. Этот параметр мы используем для изменения свойства Count. Метод IncrementCount теперь будет выглядеть так:

public void IncrementCount(int delta)
{
  Count += delta;
}

Вернитесь в AppView.xaml, обновите существующую RepeatButton добавив параметр Caliburn Micro в ActionMessage как здесь:


  

Как только нажимается кнопка, то значение 1 передается как параметр для метода IncrementCount. Добавьте другую кнопку в приложение с параметром 2 и запустите приложение. Нажимая на разные кнопки, происходит увеличение счетчика в зависимости от значения переданного параметра. Свойство Value из Caliburn Micro Parameter является зависимым свойством (dependency property), что подразумевает стандартную поддержку привязки данных WPF. Это позволяет вам использовать это в различных типах сценариев, с которыми вы столкнетесь.

Подсказка: Благодаря гибкости использования привязки данных для установки значения параметра можно передавать элементы UI из представления в модель представления. Вы должны избегать этого, как бы трудно это не было! Элементы UI в модели представления могут нарушить вашу MVVM архитектуру, что может вызвать проблемы в будущем.

Короткий синтаксис

Теперь мы изучим как использовать короткий синтаксис для тех же вещей. Давайте начнем с новой копии приложения, в котором нет следов наших экспериментов с длинным синтаксисом. Опять мы начнем изменять приложение без изменения поведения. На этот раз нам надо добавить пространство имен Caliburn Micro и заменить RepeatButton на это:


Все что мы сделали на текущий момент это использование присоединенного свойства Caliburn Micro (Message.Attach) указав в каком событии мы заинтересованы и какой метод вызвать.

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

cal:Message.Attach="[Event Click] = [Action IncrementCount(1)]"

Параметр события записан в скобках после имени метода. Я уверен, что вы теперь сможете сами добавить кнопку, которая увеличивает значение на 2.

Короткий синтаксис поддерживает специальную форму привязки данных. Для демонстрации этого давайте добавим кнопку, которая увеличивает счетчик сама. Другими словами кнопка удваивает значение счетчика. Вы можете убрать защитный метод события CanIncrementCount из предыдущей статьи, чтобы значение могло стать больше 100. Код кнопки повтора теперь должен выглядеть как-то так:


Здесь я установил Count.Text в качестве параметра. Это привяжет свойство Text для TextBlock (с именем Count), которое отображает текущий результат. Обратите внимание, что Caliburn Micro автоматически конвертирует строковое значение, которое мы хотим передать в метод, принимающий числовое значение. Другое упрощение в том, что Caliburn Micro представленной здесь, что автоматически используется соответствующее свойство пользовательского контрола, если мы его не укажем. В примере ниже мы можем написать имя "Count" для TextBlock как параметр и Caliburn Micro привяжет свойство Text по умолчанию. Теперь приложение выглядит так:

Автоматический поиск параметров

Для завершения примера я упомяну, что в Caliburn Micro даже есть соглашения автоматического подбора параметров, когда вы их явно не казали. Если вы не хотите явно указывать параметры, Caliburn Micro посмотрит имя параметра из сигнатуры метода и попытается найти любой пользовательский контрол в представлении имя которого совпадает (без учета регистра). Если совпадение найдено, то соответствующее свойство контрола будет использовано в качестве параметра. Например, если пользовательский контрол TextBlock, значение его свойства Text будет использовано как параметр. Опять же Caliburn Micro может автоматически конвертировать строки в целые числа, если необходимо.

Для простоты понимания этого соглашения, давайте попробуем это применить в приложении. Добавьте слайдер в приложение и назовите его "Delta". Добавьте другую кнопку с названием "IncrementCount". Как объяснялось в предыдущей статье, кнопка будет автоматически вызывать метод IncrementCount когда ее нажимают. Теперь у метода есть параметр, но мы не указали какое значение кнопка должна использовать. Обратите внимание что слайдер, который мы добавили с тем же именем параметра (delta). В этом случае Caliburn Micro автоматически использует значение свойства Value слайдера в качестве параметра метода, когда кнопку нажмут. Это весь код который мы должны добавить:


  
  

Дополнительно для экспертов

Здесь я раскрыл только несколько вещей, которые поддерживает Caliburn Micro для привязки к событиям. Другие интересные темы включают:

  • Установка целевых действий
  • Специальные параметры для привязки данных
  • Action bubbling
  • Защитные действия с пареметрами

Вы можете найти больше информации о привязке событий используя Caliburn Micro в онлайн документации. Я рекомендую прочесть все документацию, так вы сможете лучше выбирать подход при использовании различных событиях использования в приложении. Вы найдете много полезных вещей которые предоставляет Caliburn Micro и много удобных соглашений, которые снимут с вас лишнюю работу. Страницу Cheat Sheet. лучше добавить в закладки. Вы также найдете примеры HelloExplicitAction, HelloParameters и BubblingAction в которых можно получить хорошие начальные знания.

Вы можете скачать приложение из примера использующее расширенный синтаксис здесь и короткий синтаксис здесь.

В следующий раз мы рассмотрим Event Aggregator.

До следующего раза, увлекательного кодирования!

Оригинал: Caliburn Micro Part 3: More About Events and Parameters




Дата публикации: 24.01.2012 13:00

Ярлыки: Caliburn.Micro, Events, MVVM, WPF