Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Это справедливый вопрос, который является общей, но "разрешенной" (дебатируемой) проблемой в области архитектуры 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>

Update:

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

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

Другой немного раздражает, но работоспособен.

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

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

/Update

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

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

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

Ответ 2

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

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

который рассказывает о различных применениях событий и команд.

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