在 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中文网其他相关文章!