【问题标题】:Is it correct to have a Window(View) parameter in ViewModel class method in C# wpf mvvm?在 C# wpf mvvm 的 ViewModel 类方法中有一个 Window(View) 参数是否正确?
【发布时间】:2016-02-29 10:37:15
【问题描述】:

假设我有一个包含以下类的 wpf 项目:

//Representing the View:
class SomeWindow:Window
{
   //...
}


class SomeWindowViewModel
{
    //...
    SomeWindow window;
    public void SomeMethod(ref SomeWindow window)
    {
       //...
    }
}

如果我想使用像 MVVM 这样的架构,在 SomeWindowViewModel 类中引用 SomeWindow 类是否正确?

我问这个是因为我有一些用 WindowsForm 编写的代码,我必须用 wpf mvvm 重写它,但是应用程序的后端有很多对所有类型的 windows 窗体引用的引用,它不是我写的。据我所知,ViewModel 一定不知道关于 View 的任何事情。

【问题讨论】:

  • 您已经回答了自己的问题。这正是 MVVM 模式试图避免的紧密耦合。如果你详细说明你想要完成的事情,你可能会得到一些关于 MVVM-y 方式来做同样事情的答案。

标签: c# wpf mvvm


【解决方案1】:

简短回答:没有。

视图可以引用视图模型,但视图模型不应该引用视图。不要在 wpf 中重写你的 winforms。看看 DataTemplate、Behaviors 和 Binding 的东西。

【讨论】:

    【解决方案2】:

    不,你应该避免 View 和 View-Model 之间的那种耦合。

    MVVM 的一大优点是能够设计一个可供多个不同视图使用的 VM,或者根本没有视图。

    通过不在虚拟机中添加对具体视图的引用,您可以确保您能够满足上述声明。

    这并不意味着您被禁止与来自 VM 的视图进行交互;实际上,VM 的职责就是在 Model 和 View 之间架起桥梁。

    有多种方法可以做到这一点,这实际上是为了找到适合您的口味。事件,有一个中介,有一个视图管理器注入到虚拟机等。

    将 WinForms 移植到 WPF MVVM 具有挑战性。这是一种完全不同的工作方式,当然需要重新设计。

    祝你挑战成功!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2010-10-22
      • 1970-01-01
      • 2020-08-22
      • 2017-11-08
      • 2011-04-09
      • 1970-01-01
      相关资源
      最近更新 更多