Heim >Backend-Entwicklung >C++ >Wie schließe ich ein WPF-Formular aus dem ViewModel in MVVM?
Im MVVM-Entwurfsmuster von WPF besteht eine häufige Herausforderung darin, eine Ansicht (z. B. ein Formular) aus dem ViewModel zu schließen. ViewModel ist normalerweise für die Verwaltung der Geschäftslogik verantwortlich, während Ansichten für die Anzeige der Benutzeroberfläche (UI) verantwortlich sind.
ViewModel sollte konstruktionsbedingt keine direkte Kenntnis der Ansicht haben. Dies gewährleistet die Trennung von Belangen und ermöglicht die Unabhängigkeit der Benutzeroberfläche. Das Schließen des Formulars erfordert jedoch Zugriff auf die Ansicht, was ein Problem darstellen kann.
Traditionelle CodeBehind-Methode: Dazu gehört das Platzieren des Codes zum Schließen des Formulars in der CodeBehind-Datei der Ansicht. Dies verstößt gegen das MVVM-Muster und führt zu einer Kopplung zwischen der Ansicht und dem ViewModel.
Zusätzliche Eigenschaften mit Stilauslösern: Sie können eine angehängte Eigenschaft in einem Formular definieren und einen Stilauslöser verwenden, um das Formular zu schließen, wenn die angehängte Eigenschaft festgelegt ist. Obwohl diese Lösung den MVVM-Prinzipien folgt, erfordert sie zusätzlichen Code und kann umständlich sein.
Sie können eine benutzerdefinierte angehängte Eigenschaft namens DialogCloser erstellen, um diesen Prozess zu vereinfachen. Diese Eigenschaft akzeptiert einen bool?-Parameter, der das DialogResult des Formulars darstellt. Wenn der Wert dieser Eigenschaft festgelegt ist, wird automatisch die DialogResult-Eigenschaft des Window-Objekts festgelegt, das das Formular enthält.
<code class="language-csharp">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>
Um dieses Attribut zu verwenden, wenden Sie es einfach auf das Window-Element in Ihrer XAML-Ansicht an:
<code class="language-xml"><Window ... xc:DialogCloser.DialogResult="{Binding DialogResult}" xmlns:xc="clr-namespace:ExCastle.Wpf"></Window></code>
Binden Sie im ViewModel die DialogResult-Eigenschaft an eine boolesche Eigenschaft:
<code class="language-csharp">public class MyViewModel : INotifyPropertyChanged { ... private bool? _dialogResult; public bool? DialogResult { get { return _dialogResult; } set { _dialogResult = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DialogResult))); } } ... }</code>
Wenn die DialogResult-Eigenschaft in einem ViewModel festgelegt ist, aktualisiert die angehängte Eigenschaft DialogCloser automatisch das DialogResult des enthaltenden Window-Objekts, wodurch das Formular effektiv geschlossen wird.
Das obige ist der detaillierte Inhalt vonWie schließe ich ein WPF-Formular aus dem ViewModel in MVVM?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!