Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVVM ICommand alternative

I have begun creating a wpf mvvm app. It seems a vital ingredient to the ViewModel is a bunch of ICommands to have a loosely coupled way of allowing the view to interact with the viewmodel.

My question is this, why can't I bind directly to a method?

I have used Josh Smith's RelayCommand implementation of ICommand that allows you to inject delgates into an ICommand object, but really, is there some easier way to allow a button push to call a method in the viewmodel?

I'm new to MVVM, I believe I need some enlightenment

like image 859
Jose Avatar asked Nov 30 '22 07:11

Jose


2 Answers

You can't bind directly to a method because Button (for example) doesn't have a property that accepts a delegate. Instead, it has a Command property of type ICommand. A RelayCommand (aka DelegateCommand) is just an ICommand that wraps delegates.

I see no technical reason why it wouldn't be possible for the view to bind to specific methods on the view model by way of a markup extension:

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

However, this would be slower and would increase the coupling between the view and view model. If the view knows only about a property on the view model of type ICommand, the implementation of that command could change completely (or methods could be renamed) without the view being aware.

like image 60
Kent Boogaart Avatar answered Dec 09 '22 21:12

Kent Boogaart


I completely disagree.

The speed of invocation bears no relevance: commands are user interactions, they never require speed.

Argument about coupling is flawed too. How come {Binding MyProperty} is not coupling but {ViewMethod MyMethod} is?

Requirement of having specially crafted 'Commands' to be wrapped around methods is a silly one. Commands might be useful implementation under the cover, but we already have methods in C# and replacing them with something big and bulky is not right.

And that thing about MarkupExtension and Binding, it really is difficult. But it can be done. Actually, it is done, you can have a look at MethodCall project on CodePlex: http://methodcallthing.codeplex.com/

You can use binding to choose 'this' for the method, and can use binding to fetch arguments. And all those are live, i.e. being calculated at the time the command is invoked. Another bonus feature is push-out result of method call, you can use binding for that too (OneWayToSource).

like image 34
Oleg Mihailik Avatar answered Dec 09 '22 19:12

Oleg Mihailik