Является ли EventToCommand плохой практикой EventArgs?

Недавно я использовал набор инструментов MVVM light для Silverlight 4.

Мне очень нравится включенное поведение EventToCommand, оно значительно упрощает жизнь. Одна вещь, о которой я задавался вопросом, заключается в том, что установка PassEventArgsToCommand="True" является плохой практикой, поскольку она свяжет конкретную команду RelayCommand с конкретным событием в представлении.

Например. Если моя RelayCommand определена как:

public RelayCommand<System.Windows.Input.KeyEventArgs> myCommand

Тогда это может быть вызвано только событием KeyUp, KeyDown и т.д.

Я думал, что ViewModel не должен иметь знаний о пользовательском интерфейсе (например, выставлять логический преобразователь и использовать преобразователь, чтобы изменить его на видимость), разве PassEventArgsToCommand не нарушает это?


person Fermin    schedule 21.10.2010    source источник
comment
Я согласен с вами по этому вопросу... Команды прекрасны и денди, когда они делают что-то только на основе ViewModel, например, кнопки, но когда вы говорите о контекстных событиях в пользовательском интерфейсе, таких как положение мыши когда по нему щелкнули, это не совсем кажется мне неосведомленным ViewModel.   -  person Nathan Tregillus    schedule 08.06.2011


Ответы (3)


ViewModel - это модель для представления, поэтому, когда вы имеете в виду, что представление должно иметь или данные, которые оно должно представлять, тогда ViewModel должен его обрабатывать.

Было бы разумно использовать перечисление Visibility для представления того, какую часть представления следует просматривать, поскольку это касается состояния представления.

Что касается KeyEventArgs, это происходит из-за действия пользователя и представляет собой некоторое состояние команды, которое, если вам нужно знать, какая клавиша была нажата, является разумным ожиданием обработки ViewModel.

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

Единственный раз, когда я бы не стал использовать Visibility или KeyEventArgs или тому подобное, было бы, если бы я хотел использовать ту же ViewModel для других технологий пользовательского интерфейса. Если это ваш случай, я бы создал абстракцию (хотя, по моему опыту, это случается редко и в любом случае обычно включает свои собственные ViewModels).

person aqwert    schedule 21.10.2010

Возможно, не стоит передавать KeyEventArgs непосредственно в ViewModel, если вы хотите выполнить модульное тестирование ViewModel, то есть вы хотите вызвать команду, которая принимает KeyEventArgs в качестве параметра.

Причина этого в том, что вы не можете создать экземпляр KeyEventArgs в Silverlight (по крайней мере, насколько я мог видеть), потому что KeyEventArgs не имеет общедоступного конструктора в Silverlight.

Это означает, что вы не можете передать ключ из своего модульного теста. В этой ситуации может быть лучше сопоставить определенные ключи с командой в вашем представлении/XAML, а не просто использовать EventTrigger для события KeyDown.

Рассматривайте это как одно из решений — он предоставляет класс KeyEventToCommand, который позволяет сопоставлять ключи с командами непосредственно в XAML. http://mvvmlight.codeplex.com/discussions/252898

person G. Lombard    schedule 21.04.2011

Один из способов отделить ViewModel от View — использовать «брокера» — то, что является посредником между ними. Я использовал класс Messenger MVVMLight для реализации брокера сообщений с хорошими результатами.

ХТГ, индифромоз

person indyfromoz    schedule 21.10.2010
comment
Итак, вы бы поместили RelayCommand в отдельный класс, а не ViewModel, и вызвали бы RelayCommand оттуда? - person Fermin; 21.10.2010