gpt4 book ai didi

c# - 将 View 接口(interface)实例传递给 ViewModel

转载 作者:行者123 更新时间:2023-12-03 10:23:01 24 4
gpt4 key购买 nike

在 WPF/MVVM 中,有时需要 ViewModel 来触发 View 层的事情,例如显示 MessageBox、打开新窗口、关闭当前窗口或基于 ViewModel 中的某些条件状态启动动画。

MVVM 纯粹主义者似乎同意 ViewModel 永远不应该知道 View。所以解决以上场景,除了几个hacks为了解决一些简单的场景,一个常见的范例是使用消息传递。想象一下使用消息传递系统只是为了显示一个消息框 - MVVM can make trivial stuff pretty complicated .

让我们考虑一种不同的方法。首先,我让我的 View 实现一个接口(interface):

public class MyWindow : IClosableView

然后,在 ViewModel 的构造函数中,我让它将该接口(interface)的一个实例作为参数:
public class MyWindowViewModel(IClosableView view)

因此,当我在 View 的构造函数中设置 DataContext 时,我只需传入 View 本身:
public MyWindow()
{
InitializeComponents();

this.DataContext = new MyWindowViewModel(this);
}

这使得 ViewModel 通过 View 完成我们上面提到的那些事情变得非常简单:
public void Close()
{
this.view.Close();
}

现在,在你们所有 MVVM 纯粹主义者开始向我扔随机易碎的东西之前,让我们看看我们在这里做什么。 ViewModel 采用 View 接口(interface) ,而不是 View 本身。这意味着尽管 ViewModel 确实知道 View ,
  • 它只知道它真正需要的信息,以触发必要的 View 端操作(如果使用消息传递方法,它无论如何都需要这样做)。
  • 它不依赖于任何特定的观点;它只要求使用它的 View 将提供某些功能,在这种情况下是关闭该 View 的能力。
  • ViewModel 仍然是完全可测试的,因为可以通过在另一个类中实现 IClosableView 接口(interface)并在单元测试中传递它来模拟 View 。

  • 鉴于这种推理,我很好奇:为什么消息传递比这种简单有效的方法更好?

    编辑 :为了清楚起见,正如我在这个问题的开头所说的那样,我说的是 View 操作取决于 ViewModel 状态的情况。只需在代码隐藏中连接一个按钮就可以很容易地关闭一个窗口。但是当这取决于 ViewModel 中的某些状态时呢?

    最佳答案

    我认为 MVVM 纯度的主要焦点是您的第 2 点,它不知道 View ,但期望提供一组定义的功能。

    这本身就开始构建 View 模型只能与某些 View 一起使用的依赖关系。

    这可能适用于您的应用程序,但它不是模式。这是一个不同的解决方案,如果你能成功,那就去做吧。

    关于c# - 将 View 接口(interface)实例传递给 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25226344/

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