A Generic Implementation for ICommand






4.92/5 (5 votes)
This tip provides a simple implementation for the ICommand interface and enables to write quick code leaving the nuances of fetching the return types and asynchrony
Introduction
When I started my first project in WPF, I was faced with a lot of decisions to make. One such decision that I made was to use the Command pattern provided by System.Windows.Input.ICommand
to handle the user interactions. As I got deeper, I found that I had to:
- write lots of boilerplate code
- cannot get the result of the execution.
ICommand.Execute
returns avoid
.
The MVVM frameworks would have presented a solution but I did not want to include a new framework just for the sake of this and implemented a few classes that would handle the returned data from the command execution and also do asynchronous execution. So I went ahead and wrote few classes.
UICommand
- A plain vanilla implementation of theICommand
interfaceUICommand<T>
- AUICommand
that can return a value of typeT
AsyncUICommand
- Very similar toUICommand
but executes the user function in a threadpool threadAsyncUICommand<T>
- AAsyncUICommand
that returns a typeT
Using the Code
All you need to do is derive a class from one of the above mentioned classes and override the OnExecute
method.
The following snippet shows a sample implementation for creating a folder on the file system.
class CreateFolderCommand : AsyncUICommand
{
override protected void OnExecute(object parameter)
{
string path = parameter as string;
System.IO.Directory.CreateDirectory(path);
}
}
On the invoking side, create an object for this class:
CreateFolderCommand cmdCreateFolder = new CreateFolderCommand ();
If you need a callback after the execution, register for the event. The event will notify you with an exception object if an exception has occurred. If not, it will be null
:
cmdCreateFolder.ExecutionComplete += ((ex) => { if(ex != null){//There is some error, handle the exception here }});
That's it.
When you use the UICommand<T>
, the ExecutionComplete
event will also give you the result of the execution.
The Async versions also behave in the similar way. The event handlers will be called in the context of the UI thread and so you really need not worry about any context switching and update UI elements directly in the handler.
History
- 25th Dec, 2013: Initial post