2016-10-20 2 views
0

Dies könnte scheint eine dumme Frage, aber ich bin in einer Lernkurve dies so zu fragen. In der Tat, ich versuche, eine Alternative zu einer früheren ungelöste Frage zu finden: WPF: How to make Calls to Dispatcher.Invoke() Synchronous?

In MVVM Anwendung, wir ICommand für eine Schaltfläche Command Bindung definieren, die eine andere Methode aufrufen kann, eine andere Ansichtsmodell laden oder einige Anweisungen usw. ausführen .

Aktualisierung mit Code: Hier ist mein ICommand, die Bindung an Knopf, der das Ansichtsmodell laden wird Endview zeigen:WPF: Wie ruft man eine ICommand ähnliche Methode auf?

public ICommand EndCommand => new RelayCommand(p => 
    { 
     WixBootstrapperData.CurrentViewModel = new EndViewModel(WixBootstrapperData); 

    }); 

Aber als ich versuchte gleiches Ansichtsmodell von einer anderen Methode zu laden, es tat die Ladung g, aber zeigte nie die EndView und übersprang andere Anweisungen bis zum Ende der Methode, die tatsächlich das Ende der Anwendung selbst ist. Hier ist der Code-Schnipsel:

BootstrapperApplication.ApplyComplete + = (Absender, e) => {

 WixBootstrapperData.CurrentDispatcher.Invoke((Action)(() => 
     { 
      if (e.Restart == ApplyRestart.RestartRequired) 
      { 
       //This would be loaded, but never showed the related View and skipped to next instruction 
       WixBootstrapperData.CurrentViewModel = new EndViewModel(WixBootstrapperData); 

      } 
      //However, This would be loaded and related View would also be displayed 
      WixBootstrapperData.CurrentViewModel = new FinishViewModel(WixBootstrapperData); 
     } 
     )); 
    } 

Können wir nennen gleichen ICommand aus einem anderen Verfahren ist dasselbe Verhalten zu bekommen? Oder einen alternativen Weg?

Hat die Definition eines Ereignisses und abonnieren Sie das gleiche Verhalten innerhalb einer Methode Ausführung geben würde?

+0

Ist es möglich, dass Sie den Code für Ihre 'ICommand' Eigenschaft schreiben könnte (und möglicherweise in dem Sie den Delegaten für sie sind die Zuweisung) in Ihrem Ansichtsmodell, bitte? Ich habe unten eine Antwort hinzugefügt - aber ich möchte nicht zu sehr davon ausgehen, welchen Typ Sie verwenden. Danke –

+0

Danke für das Aktualisieren Ihrer Frage. Das ist cool, ich wollte nur sehen, wenn Sie die 'RelayCommand' als Befehlstypen wurden mit - haben einen Blick auf meine Antwort unten; hoffentlich hilft es :) –

+0

sagen Let's if (e.Restart == ApplyRestart.RestartRequired) 'wahr ist. Was geschieht? 'CurrentViewModel = EndViewModel'. Aber dann wird die Methode weiter ausgeführt und jetzt 'CurrentViewModel = FinishViewModel'. Ich denke, dass du ein "else" zwischen dem Schließen des "if" und der letzten Zeile brauchst. – Will

Antwort

2

Sie können aus einem anderen Verfahren einen Befehl ausführen.

Zunächst ist es ratsam, zu überprüfen, ob der Befehl kann ausgeführt werden, indem .CanExecute() mit - die eine bool

zurück, wenn Sie tatsächlich die commnad ausführen kann, dann können Sie .Execute() auf diesen Befehl aufrufen.


Beispiel:

Lassen Sie uns sagen, dass Ihre ICommand ist ein RelayCommand und rief MyCommand.

Lassen Sie uns sagen Sie es von SomeOtherMethod() nennen wollen:

public RelayCommand MyCommand { get; set; } 

public void SomeOtherMethod() 
{ 
    if (MyCommand.CanExecute()) 
    { 
     MyCommand.Execute(); 
    } 
} 

Die gleichen Methoden stehen zur Verfügung, wenn Sie einen DelegateCommand verwenden, als auch - ich benutze diese mit Prism.

Hoffe, das hilft! :)

+0

Ich werde das versuchen ... –

+0

Danke @FarrukhWaheed - bitte lassen Sie mich wissen, wie Sie sich verstehen :) –

+0

Ja, es wurde ohne Probleme ausgeführt, aber das Verhalten war das gleiche. Es zeigte wieder nicht die Ansicht, d. H. Mit und ohne MyCommand.Execute (this) es zeigte nie die EndView, sondern FinishView. –

Verwandte Themen