In MVVM-Anwendungen kann das Verwalten des Formularschließens eine Herausforderung sein, da das ViewModel nichts über die tatsächliche Ansicht weiß. In diesem Artikel wird eine elegante Lösung untersucht, bei der angehängte Eigenschaften zum nahtlosen Schließen eines Formulars aus einem ViewModel verwendet werden.
Stellen Sie sich ein typisches Anmeldeformular vor, bei dem das ViewModel Benutzeranmeldeinformationen enthält. Beim Senden des Anmeldebefehls startet das ViewModel den Anmeldevorgang:
Um dieser Herausforderung zu begegnen, können wir eine zusätzliche Eigenschaft nutzen, um die Lücke zwischen ViewModel und View zu schließen:
<code class="language-xml"><Window ... DialogResult="{Binding DialogResult, Source={StaticResource ViewModel}}" xmlns:xc="clr-namespace:ExCastle.Wpf"> </Window></code>
Diese Eigenschaft bindet die DialogResult-Eigenschaft des ViewModel an die DialogResult-Eigenschaft des Fensters. Wenn das ViewModel das DialogResult ändert, aktualisiert die angehängte Eigenschaft automatisch das DialogResult des Fensters und schließt das Formular entsprechend.
Das Folgende ist der Code für das angehängte Attribut:
<code class="language-csharp">using System.Windows; namespace ExCastle.Wpf { public static class DialogCloser { public static readonly DependencyProperty DialogResultProperty = DependencyProperty.RegisterAttached( "DialogResult", typeof(bool?), typeof(DialogCloser), new PropertyMetadata(DialogResultChanged)); private static void DialogResultChanged( DependencyObject d, DependencyPropertyChangedEventArgs e) { var window = d as Window; if (window != null) window.DialogResult = e.NewValue as bool?; } public static void SetDialogResult(Window target, bool? value) { target.SetValue(DialogResultProperty, value); } } }</code>
Implementieren Sie im ViewModel einfach INotifyPropertyChanged und aktualisieren Sie die DialogResult-Eigenschaft, wenn die Anmeldung erfolgreich ist:
<code class="language-csharp">private bool? _dialogResult; public bool? DialogResult { get { return _dialogResult; } set { _dialogResult = value; OnPropertyChanged(nameof(DialogResult)); } } // 登录命令逻辑 public ICommand LoginCommand { get; set; }</code>
Dieser Ansatz löst das Problem beim Schließen von Formularen auf elegante Weise, ohne die MVVM-Prinzipien zu beeinträchtigen. Das ViewModel bleibt von der Ansicht entkoppelt und steuert gleichzeitig effektiv das Schließen des Formulars durch einfache Eigenschaftenbindung.
Das obige ist der detaillierte Inhalt vonWie kann ich ein WPF-Formular aus dem ViewModel mithilfe einer angehängten Eigenschaft in MVVM schließen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!