Когда использовать события над командами в WPF?

Привет, я недавно заглянул в WPF и начал изучать события и команды. Обычно я использую команды при нажатии кнопки, что приводит к запуску метода в моей "модели просмотра".

Можно ли заставить Button реагировать на любые другие события, такие как событие MouseOver, с помощью commnds? Или в этом случае будут использоваться события WPF?

Если нужно использовать события WPF, то должна ли реализация обработчика событий просто вызывать метод в модели представления, чтобы сохранить озабоченность?

2 ответа

Решение

Это справедливый вопрос, и один, что является общим, но "решить" (спорная) проблема в MVVM архитектуре области. Если вы используете инфраструктуру MVVM, вы, вероятно, найдете что-то похожее на поведение EventToCommand, вот пример из MVVM Light Toolkit.

Короче говоря, это позволяет сопоставить событие с привязкой команды следующим образом:

<Rectangle Fill="White"
       Stroke="Black"
       Width="200"
       Height="100">
<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseEnter">
        <cmd:EventToCommand Command="{Binding TestCommand,
                                      Mode=OneWay}"
           CommandParameter="{Binding Text,
                              ElementName=MyTextBox,
                              Mode=OneWay}"
           MustToggleIsEnabledValue="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>
</Rectangle>

Обновить:

Есть два других "разумных" решения этой проблемы:

Один использует уже рассмотренное устаревшее расширение "AttachedCommandBehavior", найденное здесь.

Другой немного раздражающий, но выполнимый.

  1. Захватите команду через событие en исключительно в представлении.
  2. Запрос шага источника данных элемента управления
  3. Захватите целевой идентификатор привязки строки, который обозначает вашу команду (возможно, с использованием строки const в представлении)
  4. Вызовите вашу команду на модели представления через отражение и передайте аргументы команды.

Это выглядит грубо, но я уверен, что на самом деле это немного быстрее, чем просто использование традиционных привязок команд. Чтобы быть уверенным, мне нужно увидеть ИЛ, и я не думаю, что это имеет значение в этом случае.

/Обновить

Однако я хочу отметить, что это не всегда идеальная ситуация. Я обнаружил, что чаще всего я использую EventToCommand для решения проблемы дизайна. Пожалуйста, примите во внимание следующее:

  • Используйте события и код для обработки поведения, связанного с пользовательским интерфейсом.
  • При необходимости рассмотрите возможность создания пользовательских элементов управления, которые имеют привязки команд, особенно если вы обнаружите, что используете команды для инкапсуляции событийно-ориентированного поведения для установки связанных данных, которые затем отражаются в представлении. (т.е. установка значения прозрачности на основе близости к элементу управления или что-то подобное)
  • EventToCommand, скорее всего, следует использовать для обработки только "командных" событий (двойной щелчок и т. Д.), А не реактивных событий (при наведении мыши). Однако ничто не мешает этому. Реализуйте так, как считаете нужным.

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

Возможно, вы захотите взглянуть на этот пост:

WPF Commands vs Events Преимущества / Недостатки

который говорит о различном использовании событий и команд.

Что касается команд для других событий, вы должны взглянуть на что-то вроде EventToCommand как часть MVVMLight Toolkit, которая позволяет вам присоединить любое событие к команде в вашей модели представления. Очень полезно, особенно если вы уже используете MVVM Light (что я очень рекомендую).

Другие вопросы по тегам