2009-10-09 4 views
5

Ich baue eine einfache Dateneingabe-App in WPF-Form mit dem MVVM-Muster. Jedes Formular hat ein Presenter-Objekt, das alle Daten usw. freigibt. Ich möchte WPF-Befehle zum Aktivieren und Deaktivieren der Schaltflächen Bearbeiten/Speichern/Löschen und Menüoptionen verwenden.WPF-Befehle - Doing it no code-behind

Mein Problem ist, dass dieser Ansatz erfordert, dass ich viel Code zum Code-Behind hinzufügen. Ich versuche, meine Präsentationsschicht so dünn wie möglich zu halten, daher würde ich eher meinen, dass dieser Code/diese Logik in meiner Presenter (oder ViewModel) -Klasse statt in Code-Behind war. Kann jemand einen Weg vorschlagen, dasselbe ohne Code-Behind zu erreichen?

Meine XAML sieht ein bisschen wie folgt aus:

<Window.CommandBindings> 
    <CommandBinding 
     Command="ApplicationCommands.Save" 
     CanExecute="CommandBinding_CanExecute" 
     Executed="CommandBinding_Executed" 
    /> 
</Window.CommandBindings> 

und mein Code-behind sieht ein bisschen wie folgt aus:

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.CanExecute = (
     _presenter.SelectedStore != null && 
     _presenter.SelectedStore.IsValid); 
} 

Antwort

11

Das Model-View-Viewmodel (MVVM) Design-Muster zielt darauf ab, genau dieses Ziel zu erreichen, und Josh Smith's excellent article erklärt, wie man es anwendet.

Für Befehle können Sie die in diesem Artikel beschriebene Klasse RelayCommand verwenden.

Da Sie bereits ein Präsentatorobjekt haben, können Sie dieser Klasse eine ICommand -Eigenschaft zugänglich machen, die die gewünschte Logik implementiert, und dann den XAML an diesen Befehl binden. Es ist alles in dem Artikel erklärt.

+0

Great Link - Prost! –

0

Wenn Sie speziell versuchen, einen Befehl im ViewModel an einen der Anwendungsbefehle in XAML zu binden, müssen Sie die Infrastruktur selbst erstellen. Ich gehe, obwohl das tun in this answer was dann ermöglicht Ihnen, so etwas zu tun:

<local:RoutedCommandHandlers.Commands> 
    <local:RoutedCommandHandler RoutedCommand="ApplicationCommands.Save" 
           Command="{Binding TheSaveCommand}" /> 
</local:RoutedCommandHandlers.Commands>