2009-03-03 3 views
2

Ich habe eine ViewModel-Klasse, die auf den integrierten Refresh-Befehl reagieren soll, der von einer Schaltfläche ausgelöst wird, aber ich bin mir nicht sicher, wie das CommandTarget deklariert werden soll.Abrufen von Nicht-UI-Objekten auf WPF-Befehlsbindungen

Kurz gesagt, mein Code ist wie unten

Das Ansichtsmodell Konstruktor und CanExecute und Ausgeführt Event-Handler -

public ViewModel() 
    { 
     CommandBinding binding = new CommandBinding(NavigationCommands.Refresh, CommandHandler); 
     binding.CanExecute += new CanExecuteRoutedEventHandler(binding_CanExecute); 
     binding.Executed += new ExecutedRoutedEventHandler(binding_Executed); 
     CommandManager.RegisterClassCommandBinding(typeof(ViewModel), binding); 
    } 
    void binding_Executed(object sender, ExecutedRoutedEventArgs e) 
    { 
     Debug.Print("Refreshing..."); 
    } 

    void binding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
    { 
     e.CanExecute = true; 
    } 

Das Markup ist -

<Button Command="Refresh">refresh</Button> 

Jetzt habe ich versucht, Einstellung das CommandTarget auf dieser Schaltfläche zu {Binding Source={StaticResource ViewModel}}, aber ich bekomme eine Laufzeit sagen Cannot convert the value in attribute 'CommandTarget' to object of type 'System.Windows.IInputElement'.

Ich bin neu in den Befehlen, so ist es durchaus möglich, ich bin hier alle Arten von falsch. Anyhelp würde geschätzt werden.

Antwort

5

RoutedCommand s und MVVM nicht mischen. RoutedCommand s sind an den visuellen Baum gebunden und auf die WPF-Sammlung CommandBindings angewiesen. Sie sollten eigene ICommand Klassen implementieren, die mit dem MVVM-Muster arbeiten. Werfen Sie einen Blick auf Prism's implementations für Vorspeisen.

In meinem eigenen MVVM Projekten, habe ich ein paar Befehl Implementierungen:

  • DelegateCommand. Aufrufe stellten Delegaten bereit, um zu bestimmen, ob der Befehl ausgeführt werden kann, und um den Befehl auszuführen.
  • ActiveAwareCommand. Funktioniert in Verbindung mit einer Schnittstelle (IActiveAware) und sendet Befehlsausführungen an das gerade aktive Element. Mehrere aktive Aware-Implementierungen registrieren sich selbst mit dem Befehl und der Befehl routet automatisch CanExecute/Execute Aufrufe an das gerade aktive Element.
+0

Dank Kent. das hilft – Stimul8d