Является ли EventToCommand прохождение EventArgs плохой практикой? - PullRequest
3 голосов
/ 21 октября 2010

Я недавно использовал легкий инструментарий MVVM для Silverlight 4.

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 22 октября 2010

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

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

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

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

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

1 голос
/ 21 апреля 2011

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

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

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

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

0 голосов
/ 21 октября 2010

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

HTH, индифромоз

...