Ich habe eine Menu
wo jeder MenuItem
in der Hierarchie seine Command
Eigenschaft auf eine von RoutedCommand
mir definierte gesetzt hat. Das zugehörige CommandBinding
stellt einen Rückruf zur Verfügung, dessen Auswertung CanExecute
den aktivierten Status von jedem steuert MenuItem
.
Das funktioniert fast . Die Menüpunkte zeigen zunächst die richtigen aktivierten und deaktivierten Zustände an. Wenn sich jedoch die Daten CanExecute
ändern, die mein Rückruf verwendet, muss der Befehl ein Ergebnis aus meinem Rückruf erneut anfordern, damit dieser neue Status in der Benutzeroberfläche angezeigt wird.
Es scheint keine öffentlichen Methoden dafür RoutedCommand
oder CommandBinding
dafür zu geben.
Beachten Sie, dass der Rückruf erneut verwendet wird, wenn ich auf das Steuerelement klicke oder es eingebe (ich denke, er wird bei der Eingabe ausgelöst, da ein Mouse-Over die Aktualisierung nicht verursacht).
quelle
Für alle, die später darauf stoßen; Wenn Sie MVVM und Prism verwenden, bietet die
DelegateCommand
Implementierung von PrismICommand
eine.RaiseCanExecuteChanged()
Methode, um dies zu tun.quelle
RaiseCanExecuteChanged()
einfachen Aufrufe anCommandManager.InvalidateRequerySuggested()
.((RelayCommand)MyCommand).RaiseCanExecuteChanged();
hat bei mir mit GalaSoft.MvvmLight.Command funktioniert - ABER nach dem Wechsel zuCommandWPF
hat es funktioniert, ohne dass etwas aufgerufen werden musste. Danke @ fuchs777Ich konnte es nicht benutzen,
CommandManager.InvalidateRequerySuggested();
weil ich einen Leistungseinbruch bekam.Ich habe den Delegating-Befehl von MVVM Helper verwendet , der wie folgt aussieht (ich habe ihn für unsere Anforderungen ein wenig optimiert). Sie müssen
command.RaiseCanExecuteChanged()
von VM anrufenquelle
Wenn Sie Ihre eigene Klasse gewürfelt haben, die implementiert
ICommand
, können Sie viele der automatischen Statusaktualisierungen verlieren, Sie sich mehr als nötig auf die manuelle Aktualisierung verlassen müssen. Es kann auch brechenInvalidateRequerySuggested()
. Das Problem ist, dass eine einfacheICommand
Implementierung den neuen Befehl nicht mit dem verknüpfen kannCommandManager
.Die Lösung besteht darin, Folgendes zu verwenden:
Auf diese Weise werden Abonnenten an
CommandManager
Ihre Klasse angehängt und können ordnungsgemäß an Änderungen des Befehlsstatus teilnehmen.quelle
Ich habe eine Lösung implementiert, um die Eigenschaftsabhängigkeit von Befehlen zu behandeln. Hier den Link https://stackoverflow.com/a/30394333/1716620
Dank dessen haben Sie am Ende einen Befehl wie diesen:
quelle
Folgendes hat bei mir funktioniert: Stellen Sie CanExecute vor den Befehl in der XAML.
quelle