MVVM: Asynchronous Commands

Posted on

The latest cut of the Apex Code ( contains a very cool new feature - Asynchronous Command Objects.

An Asynchronous Command is a ViewModelCommand - the standard object used in Apex for commanding. However, what is different about this function is that it runs Asynchronously.

One of the problems with running a view model command asynchronously is that generally the view model properties cannot be accessed - as they're created on a different dispatcher. This problem is resolved by using the 'ReportProgress' function. Here's an example:

public class SomeViewModel : ViewModel
  public SomeViewModel()
     // Create the command.
     asyncCommand = new AsynchronousCommand(DoAsyncCommand, true);

private void DoAsyncCommand() { for(int i = 0; i < 100; i++) { // Perform some long operation. string message = DoSomeLongOperation();

    // Add the message to the View Model - safely!
      () =&gt;


private ObservableCollection<string> messages = new ObservableCollection<string>();

public ObservableCollection<string> Messages { get { return messages; } }

private AsynchronousCommand asyncCommand;

public AsynchronousCommand AsyncCommand { get { return asyncCommand; } } }

In this basic mock-up we have a command called 'AsyncCommand' (which we could bind a button to for example) which invokes DoAsyncCommand. However, it invokes it Asynchronously. We can also update the ViewModel properties by using ReportProgress - meaning AsyncCommands can seamlessly provide live feedback while they're working - and we're keeping well locked in with the MVVM commanding model!

Expect a full article soon on the CodeProject, until then the source is at: