在 MVVM 應用程式中,管理窗體關閉可能具有挑戰性,因為 ViewModel 並不了解實際視圖。本文探討了一種使用附加屬性的優雅解決方案,以便從 ViewModel 無縫關閉窗體。
考慮一個典型的登入窗體,其中 ViewModel 保持使用者憑證。提交登入指令時,ViewModel 啟動登入操作:
為了應對這個挑戰,我們可以利用一個附加屬性來彌合 ViewModel 和視圖之間的差距:
<code class="language-xml"><Window ... DialogResult="{Binding DialogResult, Source={StaticResource ViewModel}}" xmlns:xc="clr-namespace:ExCastle.Wpf"> </Window></code>
此屬性將 ViewModel 的 DialogResult 屬性綁定到視窗的 DialogResult 屬性。當 ViewModel 修改 DialogResult 時,附加屬性會自動更新視窗的 DialogResult 並相應地關閉窗體。
以下是附加屬性的程式碼:
<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>
在 ViewModel 中,只需實作 INotifyPropertyChanged 並在登入成功時更新 DialogResult 屬性:
<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>
這種方法優雅地解決了窗體關閉問題,而不會影響 MVVM 原則。 ViewModel 仍然與視圖分離,同時透過簡單的屬性綁定有效地控制窗體關閉。
以上是如何使用 MVVM 中的附加屬性從 ViewModel 關閉 WPF 表單?的詳細內容。更多資訊請關注PHP中文網其他相關文章!