Когда использовать события над командами в WPF? - PullRequest
30 голосов
/ 23 мая 2011

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

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

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

Ответы [ 2 ]

13 голосов
/ 23 мая 2011

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

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

<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. Захватите цель привязки строки идентификатор, который обозначает вашу команду (возможно, используя константную строку на вид)
  4. Вызвать вашу команду на модель представления через отражение и передать аргументы команды.

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

/ Update

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

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

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

6 голосов
/ 23 мая 2011

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

Команды WPF и события Преимущества / недостатки

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...