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 a void
.
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 the ICommand
interface UICommand<T>
- A UICommand
that can return a value of type T
AsyncUICommand
- Very similar to UICommand
but executes the user function in a threadpool thread AsyncUICommand<T>
- A AsyncUICommand
that returns a type T
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){}});
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