问题
在 WPF 程序中经常需要用弹出窗口的形式向用户确认操作, 用户阅读完相关信息后, 点击上面的 OK,Cancel 按钮关闭窗口, 再进行后续操作. 当使用 MVVM 设计模式时, OK 和 Cancel 会 binding 到 ViewModel 中的相关属性上, 因而在 ViewModel 中, 我们希望在用户点击了 Ok 或 Cancel 之后关闭这个弹窗并返回用户的选择结果, 但是由于 Windows 类本身所带的属性 DialogResult 不是一个 Dependency Proerty, 我们也就不能把它 Binding 到一个 ViewModel 属性上, 再通过设置该属性来关闭窗口. 那么我们该如何在 ViewModel 关闭该窗口呢?
解决方案
这里所讲的一种解决方案是使用 Attached Property. 如下所示我们创建了一个静态类, 它包含一个 Attached Property.
- 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 Windows = d as Windows;
- if (Windows != null)
- {
- Windows.DialogResult = e.NewValue as bool?;
- }
- }
- public static void SetDialogResult(Windows target, bool? value)
- {
- target.SetValue(DialogResultProperty, value);
- }
- }
在使用时, 只需要把这个属性 Attach 到相关窗口上并 Binding 到后台 ViewModel 的属性上, 下面是一个例子, 完整的例子请参见 https://github.com/DerekLoveCC/Writings/tree/master/Blog/Code/AStockViewer:
来源: http://www.bubuko.com/infodetail-3098907.html