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