Bester Weg, um das Fenster mit mefedMvvm zu schließen
Frage
In meiner Bewerbung habe ich einen Hauptwindow, den ich über mefedMvvm the ViewModel importiert habe:
xmlns:mefed="clr-namespace:MEFedMVVM.ViewModelLocator;assembly=MEFedMVVM.WPF"
mefed:ViewModelLocator.ViewModel="MainViewModel"
Und jetzt habe ich auch mein ViewModel, das das ViewModel erkennt:
[ExportViewModel("MainViewModel")]
public class MainViewModel: ViewModelBase
In meinem ViewModel habe ich eine sympathische Eigenschaft zum Schließen des Fensters. Die Veranstaltung zum Schließen kann von überall kommen. Und mit Hilfe des Cinch Framework 2.0 realisiere ich einen einfachen mit Ausführungsmethode.
Frage
Wie kann ich das Fenster von meiner ausführenden Methode aus schließen? Über die Abhängigkeitsinjektion habe ich keinen Konstruktor. Ich kann kein Ereignis registrieren oder die Ansicht als Parameter für das ViewModel angeben.
Bearbeiten
Eine Möglichkeit, die ich jedoch nicht schön halte:
Nennen Sie dies in der Methode
Application.Current.MainWindow.Close()
Lösung
Sie können dies erreichen, indem Sie eine schreiben ICommand
das passt an Window
Instanz als Parameter.
Ein gutes Beispiel ist hier erhältlich: Wie kann ich allen WPF-Fenstern innerhalb eines Projekts das Verhalten "Close on Escape-Key Press" zuweisen?
In diesem Beitrag die ICommand
ist schließlich an a gebunden KeyBinding
(Damit die Escape -Taste verwendet werden kann, um das Fenster zu schließen. Der wichtige Teil ist, a zu verwenden RelativeSource
Auf Ihrem Befehlsparameterbindung an die Referenz auf die Window
dass du schließen willst
Bearbeiten Sie als Antwort auf Kommentare
Der Befehl ist ein Singleton, aber es ist nicht erforderlich, dass er es ist - es ist nur ein Singleton, weil er Staatenlos ist und die Bindung erleichtert. Es erwirbt einen Verweis auf die Window
durch Bindung, also für a UserControl
Sie können nur verwenden:
<Button Command="{x:Static mynamespace:CloseWindowCommand.Instance}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Content="Close My Parent Window" />
Es ist etwas komplizierter und benötigt einen anderen Ansatz. Ein gutes Beispiel finden Sie hier: http://gallery.expression.microsoft.com/windowclosebehavior