Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

A Generic Implementation for ICommand

0.00/5 (No votes)
24 Dec 2013 2  
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:

  1. write lots of boilerplate code
  2. 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){//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

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here