Die Schaltfläche wird nicht deaktiviert, wenn der Befehl CanExecute false ist

8

Ich habe ein einfaches Fenster mit einer Schaltfläche, die mit einem Befehl an ein ViewModel gebunden ist.

Ich erwarte, dass die Schaltfläche deaktiviert wird, wenn MyCommand.CanExecute () false ist. Aber es scheint, dass WPF die IsEnabled-Eigenschaft nur festlegen wird, wenn das Fenster zuerst gezeichnet wird. Jede nachfolgende Aktion wirkt sich nicht auf den sichtbaren Status der Schaltfläche aus. Ich verwende einen DelegateCommand von Prism.

Meine Ansicht:

%Vor%

und mein ViewModel:

%Vor%

50% der Zeit, wenn meine Anwendung geladen wird, ist die Schaltfläche ordnungsgemäß deaktiviert. Wenn es jedoch aktiviert wird, wenn das Fenster geladen wird, und ich auf die Schaltfläche zum Ausführen des Befehls klicke, erwarte ich, dass die Schaltfläche 50% der Zeit deaktiviert wird, aber das geht nicht. Der Befehl wird nicht ausgeführt, aber ich kann trotzdem auf die Schaltfläche klicken. Wie bekomme ich WPF zu verstehen, dass die Schaltfläche deaktiviert sein sollte, wenn CanExecute () falsch ist?

    
Greg Ferreri 22.02.2013, 20:29
quelle

2 Antworten

6

Ich sehe, dass Sie Prism und seine NotificationObject und DelegateCommand verwenden, also sollten wir erwarten, dass es in RaiseCanExecuteChanged () keinen Fehler gibt.

Der Grund für das Verhalten ist jedoch, dass Prisms RaiseCanExecuteChanged synchron arbeitet, also wird CanDoStuff() aufgerufen, während wir uns immer noch in der Implementierung von ICommand.Execute() befinden und das Ergebnis dann scheinbar ignoriert wird.

Wenn Sie eine andere Schaltfläche mit einem eigenen Befehl erstellen und _myCommand.RaiseCanExecuteChanged() von diesem Befehl / dieser Schaltfläche aus aufrufen, wird die erste Schaltfläche wie erwartet aktiviert / deaktiviert.

Oder, wenn Sie dasselbe mit MVVM Light und RelayCommand versuchen, wird Ihr Code funktionieren, weil MVVM Lights RaiseCanExecuteChanged Aufrufe CommandManager.InvalidateRequerySuggested() aufruft, die asynchron den Aufruf von CanDoStuff asynchron aufrufen, indem Sie Dispatcher.CurrentDispatcher.BeginInvoke verwenden, um das Verhalten zu vermeiden Sehen mit der Implementierung von Prism.

    
Phil 22.02.2013, 22:40
quelle
0

Sie können dies versuchen ( Microsoft.Practices.Prism.dll ist notwendig)

%Vor%     
isxaker 04.05.2016 16:28
quelle

Tags und Links