Nicht-UI-Objekte kennen zu WPF Befehl Bindungen reagieren
Frage
Ich habe eine Viewmodel-Klasse, die i-Befehl in Aktualisieren des eingebauten reagieren will Zugstrecke von einer Schaltfläche ausgelöst wird, aber ich bin nicht sicher, wie die Command zu erklären.
Kurz gesagt, mein Code ist wie unten
Der Viewmodel 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>
Nun, ich habe versucht, auf diese Schaltfläche, um die Command Einstellung 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 auf Befehle, so dass es durchaus möglich ist, ich alle Arten von falsch bin hier. Anyhelp würde geschätzt.
Lösung
RoutedCommand
s und MVVM nicht mischen. RoutedCommand
s an den visuellen Baum gebunden und auf WPF CommandBindings
Sammlung verlassen. Sie sollten Ihre eigenen ICommand
Klassen implementieren, die mit dem MVVM Muster arbeiten. Schauen Sie sich auf Prism Implementierungen für den Anfang.
In meinem eigenen MVVM Projekte, ich habe ein paar Befehl Implementierungen:
-
DelegateCommand
. Fordert die Delegierten zur Verfügung gestellt, um zu bestimmen, ob der Befehl ausgeführt werden kann, und den Befehl auszuführen. -
ActiveAwareCommand
. Arbeitet in Verbindung mit einer Schnittstelle (IActiveAware
) und sendet Befehlsausführungen an das gerade aktive Element. Mehrere aktive bewusst Implementierungen registrieren sich mit dem Befehl und der Befehl automatisch RoutenCanExecute
/Execute
Anrufe an die gerade aktive Element.