Asynchrone Commands im MVVM-Stil

Stephen Cleary zeigt in seinem Artikel ‘Patterns for Asynchronous MVVM Applications‘ wie ein MVVM-typischer Command  für asynchrone Methoden implementiert werden kann. Mit diesen Post möchte ich zeigen wie die AsyncCommand-Klasse so erweitert werden kann, dass auch parametrierte Methoden damit gekapselt werden können. Bevor es weiter geht empfehle ich den Msdn-Artikel von Stephen Cleary zu lesen.

Viele der gängigen MVVM-Frameworks stellen neben einer einfachen Implementierung der ICommand-Schnittstelle (z.B. RelayCommand) auch eine generische/parametrierte Variante (z.B. RelayCommand<TParam>) zur Verfügung. Mit Hilfe der generischen Variante kann eine Methode gekapselt werden, die ein Argument vom Typ TParam annimmt. Der zu übergebende Parameter kann dann per DataBinding festgelegt werden. Beispielsweise über die CommandParameter-Eigenschaft der ButtonBase-Klasse.

Der folgende Code zeigt wie der AsyncCommand von Stephen Cleary um diese Funktionalität erweitert werden kann.

Diese Klasse kapselt eine asynchrone Methode ohne Rückgabewert, also vom Typ ‘(CancllationToken, TParam) -> Task‘ kapseln. Um die Eigenschaften des Rückgabe-Tasks dem View per Databinding zur Verfügung zu stellen, benötigen wir eine parameterlose Variante der NotifyTaskCompletion-Klasse.

Mit dieser Command-Implementierung können lange dauernde Operationen ausgeführt werden, ohne den UI-Thread einzufrieren. Über die CancelCommand-Eigenschaft kann die Operation optional abgebrochen werden. Außerdem können Task-Eigenschaften wie IsCompleted, IsFaulted usw. im XAML verwendet werden um Ladebalken oder ähnliches anzuzeigen.

 Folgendes Beispiel zeigt wie die beschriebene AsnycCommand-Implementierung verwendet werden kann um Primzahlen zu berechnen.

Ein Beispiel-UI zur Berechnung der Primzahlen:

screenshot

Eine AsyncCommand-Variante mit Parameter und Rückgabewert findet ihr zusammen mit dem Beispielprojekt auf Github.

Links:

  1. Beispiel Projekt auf Github.
  2.  Stephen Cleary´s reihe ‘Patterns for Asynchronous MVVM Applications’
  3. RelayCommand bzw. RelayCommand<T> des MVVM-Light Frameworks

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *