Ich verwende die aktuelle Version von MvvmLight, die auf Nuget (4.1.23.0) verfügbar ist, und der Aufruf von RaiseCanExecuteChanged scheint in einem Komponententest nichts zu tun. Das Szenario ist sehr einfach, ich habe einen Befehl:
%Vor%Ich mache es im View-Modellkonstruktor neu und weise es auf einige private Methoden hin:
%Vor% Dann rufe ich im Setzer für SomeRequiredProperty
RaiseCanExecuteChanged:
Jetzt in einem Komponententest mache ich folgendes:
%Vor%Der Test schlägt fehl, weil mein Ereignishandler nicht feuert. Warum ist das so?
Update: Das Verhalten funktioniert tatsächlich zur Laufzeit.
behoben!
nemesv war korrekt, da FooCommand.RaiseCanExecuteChanged()
einfach CommandManager.InvalidateRequerySuggested()
aufruft.
Darüber hinaus leitet FooCommand.CanExecuteChanged
den Handler einfach an das Ereignis CommandManager.RequerySuggested
weiter:
Die Ursache für das Problem war die folgende Codezeile in CommandManager Klasse:
%Vor% Diese Zeile platziert ein Arbeitselement mit DispatcherPriority Background
auf der Arbeitselementwarteschlange Dispatcher . Das Workitem soll alle Handler des CommandManager.RequerySuggested
-Ereignisses benachrichtigen.
Das Problem besteht darin, dass dieses Arbeitselement nie ausgeführt wird.
Die Lösung besteht darin, den Dispatcher zum Ausführen des Arbeitselements zu zwingen.
Ich fand die Lösung in dieser Diskussion auf der MVVM Foundation CodePlex-Seite. Ich habe es geschafft, den Code etwas in die folgende Hilfsklasse zu vereinfachen.
%Vor%Mein Test sieht jetzt so aus:
%Vor%Und am wichtigsten ist es:)
Tags und Links wpf c# mvvm mvvm-light relaycommand