gpt4 book ai didi

c# - ViewModel 应该如何关闭表单?

转载 作者:IT王子 更新时间:2023-10-29 03:29:01 26 4
gpt4 key购买 nike

我正在尝试学习 WPF 和 MVVM 问题,但遇到了障碍。这个问题类似但不完全相同as this one (handling-dialogs-in-wpf-with-mvvm) ...

我有一个使用 MVVM 模式编写的“登录”表单。

此表单有一个包含用户名和密码的 ViewModel,它们使用普通数据绑定(bind)绑定(bind)到 XAML 中的 View 。它还具有绑定(bind)到表单上的“登录”按钮的“登录”命令,再次使用普通数据绑定(bind)。

当“登录”命令触发时,它会调用 ViewModel 中的一个函数,该函数关闭并通过网络发送数据以进行登录。此函数完成后,有 2 个 Action :

  1. 登录无效 - 我们只显示一个 MessageBox,一切正常

  2. 登录有效,我们需要关闭登录表单并让它返回 true 作为其 DialogResult...

问题是,ViewModel 对实际 View 一无所知,所以它如何关闭 View 并告诉它返回特定的 DialogResult?我可以在 CodeBehind 中粘贴一些代码,和/或将 View 传递给 ViewModel,但这似乎会完全破坏 MVVM 的全部意义...


更新

最后我只是违反了 MVVM 模式的“纯粹性”,让 View 发布一个 Closed 事件,并公开一个 Close 方法。然后 ViewModel 将只调用 view.Close。 View 仅通过接口(interface)了解并通过 IOC 容器连接,因此不会丢失可测试性或可维护性。

接受的答案是 -5 票似乎很愚蠢!虽然我很清楚一个人在“纯粹”的情况下解决问题所获得的良好感觉,但我当然不是唯一认为 200 行事件、命令和行为只是为了避免在“模式”和“纯度”的名字有点可笑....

最佳答案

我的灵感来自 Thejuan's answer编写一个更简单的附加属性。没有样式,没有触发器;相反,您可以这样做:

<Window ...
xmlns:xc="clr-namespace:ExCastle.Wpf"
xc:DialogCloser.DialogResult="{Binding DialogResult}">

这几乎就像 WPF 团队做对了并且首先使 DialogResult 成为依赖属性一样干净。只是放一个 bool 值? ViewModel 上的 DialogResult 属性并实现 INotifyPropertyChanged,瞧,您的 ViewModel 只需设置一个属性即可关闭窗口(并设置其 DialogResult)。 MVVM 应该是这样的。

这是 DialogCloser 的代码:

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);
}
}
}

我也发布了这个 on my blog .

关于c# - ViewModel 应该如何关闭表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/501886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com