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