Warum funktioniert RelayCommand RaiseCanExecuteChanged nicht in einem Komponententest?

8

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:

auf %Vor%

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.

    
andrej351 20.08.2012, 07:34
quelle

1 Antwort

7

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:

%Vor%

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:)

    
andrej351 24.08.2012, 02:05
quelle

Tags und Links