2009-08-10 11 views
6

Bitte beurteilen Sie nicht streng, wenn diese Frage zuvor oder indirekt in riesigen Prisma und MVVM Blogs beantwortet wurde. In WPF Implementierung von RelayCommand oder DelegateCommand Klassen gibt es eine solche EventhandlerMVVM (ICommand) in Silverlight

/// <summary> 
/// Occurs whenever the state of the application changes such that the result 
/// of a call to <see cref="CanExecute"/> may return a different value. 
/// </summary> 
public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 

aber in SL Teilmenge von Namensräumen gibt es keine Befehlsmanager-Klasse. Und hier stecke ich fest. Ich habe noch keinen Workaround dafür in MVVM Adoption für SL gefunden (PRISM ist für mich noch so komplex). Verschiedene einfache HelloWorldMVVM-Apps werden überhaupt nicht behandelt.

Vielen Dank im Voraus und sorry für mein Englisch -)

Antwort

5

Es gibt keine Unterstützung für Befehle in Silverlight. Wenn der Benutzer die Steuerelemente in Ihrer Ansicht bearbeitet, müssen Sie Code (z. B. Ereignishandler) schreiben, der das Ansichtsmodell im Code-Behind für Ihre Ansicht ändert. Dies könnte so einfach sein wie das Aufrufen einer Methode für das Ansichtsmodell, wenn der Benutzer auf eine Schaltfläche in der Ansicht klickt. Mit PRISM können Sie angehängte Eigenschaften im XAML für Ihre Ansicht erstellen, um diese Event-Handler loszuwerden, aber wenn Sie PRISM lieber nicht verwenden möchten, können Sie einfach Event-Handler verwenden.

Ein anderer Aspekt, den Sie behandeln müssen, ist das Ändern der Ansicht, wenn sich das Ansichtsmodell ändert. Insbesondere möchten Sie Steuerelemente basierend auf dem Status des Ansichtsmodells aktivieren und deaktivieren. Um dies zu erreichen, müssen Sie die Eigenschaft IsEnabled eines Steuerelements an etwas im Ansichtsmodell binden, das angibt, ob eine bestimmte Operation zulässig ist. Die Implementierung benutzerdefinierter IValueConverter Objekte, die in boolesche Werte konvertiert werden, ist oft nützlich. Wenn Ihr Ansichtsmodell beispielsweise über eine Eigenschaft verfügt, die eine Anzahl darstellt und ein bestimmtes Steuerelement in der Ansicht nur aktiviert werden soll, wenn die Anzahl größer als Null ist, können Sie einen Wertkonverter erstellen, der in true konvertiert, wenn die Anzahl größer ist als null und verwenden Sie diesen Wertkonverter in der Bindung.

Wenn Sie versuchen, ein WPF-Beispiel einer MVVM-Anwendung anzupassen, müssen Sie alle Befehle löschen und Ihren eigenen Code ersetzen. Der Code in Ihrem Beispiel ist in Silverligt nicht sinnvoll, aber in WPF ist er an der Bestimmung beteiligt, ob ein Steuerelement in der Ansicht aktiviert, sichtbar usw. ist.

+0

Ich denke, Sie sind ein bisschen falsch - es gibt Unterstützung von ICommand (möglicherweise begrenzt, aber es existiert und die Klasse ICommand existiert) in Silverlight 2 –

+1

Es ist wahr, dass die 'ICommand'-Schnittstelle in Silverlight definiert ist, aber Es wird nirgends verwendet und die gesamte befehlende Infrastruktur in WPF, die mit dem MVVM-Muster so gut funktioniert, fehlt in Silverlight. –

+0

Danke. Ich dachte, dass ICommand-Präsenz vollständige Unterstützung bedeutet, also habe ich mich geirrt - (Es stellt sich heraus, dass MVVM-Implementierung in SL nicht so einfach ist wie in WPF. Ich habe bisher nur einen Weg gefunden - mit angehängten Eigenschaften und Verhalten dies: http://blogs.southworks.net/jdominguez/2008/08/icommand-for-silverlight-with-attached-behaviors/ oder mit Ready Framework, wo viele der Ereignisse angenommen werden http: // nroute. codeplex.com –

5

Silverlight 4.0 unterstützt die ICommand-Schnittstelle und stellt daher einen WPF bereit wie eine befehlende Infrastruktur.

Verwandte Themen