MVVM ICommand альтернатива - PullRequest
3 голосов
/ 29 мая 2009

Я начал создавать приложение wpf mvvm. Кажется, жизненно важным компонентом для ViewModel является набор ICommands, чтобы иметь слабо связанный способ, позволяющий представлению взаимодействовать с моделью представления.

У меня такой вопрос: почему я не могу напрямую связываться с методом?

Я использовал реализацию Jom Smith RelayCommand для ICommand, которая позволяет внедрять delgates в объект ICommand, но на самом деле, есть ли какой-нибудь более простой способ позволить нажатие кнопки для вызова метода в модели представления?

Я новичок в MVVM, полагаю, мне нужно немного просветления

Ответы [ 4 ]

7 голосов
/ 29 мая 2009

Вы не можете привязать напрямую к методу, потому что Button (например) не имеет свойства, которое принимает делегата. Вместо этого он имеет свойство Command типа ICommand. RelayCommand (он же DelegateCommand) - это просто ICommand, охватывающий делегатов.

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

<Button Command="{ViewModelMethod SomeMethodName}"/>

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

6 голосов
/ 19 июля 2009

Я полностью не согласен.

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

Аргумент о связи тоже ошибочен. Почему {Binding MyProperty} не связан, но {ViewMethod MyMethod} есть?

Требовать наличия специально созданных «Команд», чтобы обернуть их вокруг методов, глупо. Команды могут быть полезной реализацией под прикрытием, но у нас уже есть методы в C #, и замена их чем-то большим и громоздким не верна.

А вот что касается MarkupExtension и Binding, это действительно сложно. Но это может быть сделано. На самом деле, все готово, вы можете взглянуть на проект MethodCall на CodePlex: http://methodcallthing.codeplex.com/

Вы можете использовать привязку, чтобы выбрать 'this' для метода, и можете использовать привязку, чтобы получить аргументы. И все они живы, то есть рассчитываются во время вызова команды. Еще одна бонусная функция - результат выталкивания при вызове метода, для которого вы также можете использовать привязку (OneWayToSource).

5 голосов
/ 03 сентября 2009

ICommand предоставляет CanExecute, который необходим для включения управления. Простого делегата нет. ICommand - это путь.

3 голосов
/ 25 июня 2010

Очевидно, что Microsoft нужна была команда, чтобы быть чем-то первоклассным, вероятно, потому что они чувствовали, что наличие CanExecute было необходимо для большинства приложений. Я не согласен и думаю, что CanExecute должен был быть просто еще одним DependencyProperty, который вы бы связали со свойством вашей модели представления, но, эй, что я знаю?

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

Лично я избегаю использования команд в MVVM из-за путаницы, которую вы должны создать для их реализации. Я просто позволил событиям делегата с выделенным кодом представления до модели представления.

...