16 Nov
2008

ICommand in Silverlight 2 für Buttons & Co

 

Leider ist es  - out of the Box – in Silverlight nicht möglich wie in WPF ein auf ICommand basiertes Kommando an ein Button oder andere Controls zu binden. Zwar ist ICommand als Interface definiert, aus Kompatibilitätsgründen, aber es wird von Silverlight selber nicht verwendet.

Überlebensnotwendig ist ICommand sicher nicht, man kann sich ja an die Events binden und wieder alles im Codebehind haben ;)

Arbeitet man mit dem Model-View-ViewModel Pattern, so möchte man sich nicht unbedingt an die Events binden. Dies ist zwar weiterhin nmöglich sich an Events zu binden, jedoch finde ich ICommand von WPF ganz charmant und wollte es auch unter Silverlight 2 verwenden.

Denn von dem Gedanken, dass man Sinnvoll über verschiedenen Architekturen einen Presenter/Controller hat, habe ich mich verabschiedet. Sich auf den kleinsten gemeinsamen Nenner zu einigen wird keiner Darstellungstechnologie (z.B. WinForms, WPF/Silverlight und ASP.NET) gerecht und macht nicht wirklich Sinn. Dann lieber die zur Technologie passenden Patterns.

Also die Unterstützung selber bauen

Ich habe mir ein CommandButton-Control gebaut, sowie ein CommandTextBox-Control. Und da teilen so schön ist, kommt dass ganze hier direkt mit Quelltext.

Es sind meine ersten Silverlight Controls. Wenn es also was zu verbessern gibt, dann teilt es mir mit (am besten über die Kommentare).

Die Anwendung ist ganz einfach, die kompilierte Assembly  - oder das Projekt -in dass entsprechende Silverlight Projekt referenzieren, und in den XAML-Dateien den entsprechenden Namespace ergänzen.

<UserControl
    xmlns:controls="clr-namespace:DerAlbert.Silverlight.Controls;assembly=DerAlbert.Silverlight.Controls" 
>
</UserControl>

CommandButton

Der CommandButton ist eine von Button abgeleitete Klasse und kann somit alles was ein Button kann. Zusätzlich hat er die Properties Command und CommandParameter. An diese kann man nun mit Binding ein Kommando und Parameter binden.

<controls:CommandButton 
          Command="{Binding Path=Commands.DeactivateSubscriber}"
          CommandParameter="{Binding Path=SelectedSubscriber}" 
          Content="Sperren"/>

Der CommandButton unterstützt ICommand.CanExecute() und aktiviert und deaktiviert sich selbst entsprechend.

CommandTextBox

Die CommandTextBox ist von TextBox abgeleitet und führt das angegebene Kommando immer dann aus wenn sich der Text geändert hat und noch nicht über das DataBinding an das ViewModel weitergegeben wurde.

Neben dem Property TextChangedCommand für das Kommando gibt es noch CommandDelay womit die Verzögerung des Ausführens in Millisekunden angeben wird. Nach jedem Tastendruck wir die Verzögerung zurückgesetzt.

<controls:CommandTextBox 
         Text="{Binding Mode=TwoWay, Path=SearchText}" 
         TextChangedCommand="{Binding Path=Commands.SearchSubscriber}" 
         CommandDelay="300" />

ICommand.CanExecute() wird hier nicht berücksichtigt und als Execute-Parameter erhält man den eingebenen Text.

Download


Der Eintrag ist mir etwas Wert
 
Comments have been closed on this topic.