【问题标题】:How do I let the View know its have to close the Window?如何让视图知道它必须关闭窗口?
【发布时间】:2012-02-14 08:00:18
【问题描述】:

我正在使用 MVVM,据我所知,数据的通信是 View ViewModel Model。

ViewModel 可以通过双向绑定与 View 进行交互。

但现在我有一个 LoginView(它在一个窗口中),如果登录成功将在 ViewModel 中进行检查。

当它失败时,它应该告诉窗口关闭。但是……怎么办? ViewModel 不应该知道 View....

【问题讨论】:

  • 触发一个事件并让视图响应它?
  • 可能重复here
  • 这里我们倾向于打破通常的 MVVM 规则,我们的 WindowViewModel 知道它的窗口,否则很难正确处理窗口。在那之后,我们再也没有接触过 ViewModel 中的 View,而且它工作得很好。
  • @docmanhattan omg,答案是天才,哈哈谢谢

标签: c# wpf mvvm


【解决方案1】:

这是另一种选择。您可以使用委托而不是使用事件:

public class View {
    ...
    myViewModel.OnFail = () => {this.Close();};
    ...
}

public class MyViewModel {
    public Action OnFail {get; set;}

    private void Login() {
        ....
        if (failed && OnFail != null)
            OnFail();
    }
}

【讨论】:

    【解决方案2】:

    您应该向 ViewModel 添加特定事件(例如 LoginFailed)。然后您应该将此事件链接到关闭窗口的命令。请参阅this 博客文章了解如何将两者联系起来。

    【讨论】:

      【解决方案3】:

      我会在这里简单一点,并使用一个事件来通知它应该关闭的视图。

      视图模型:

      public event EventHandler LoginFailed;
      
      public void Login()
      {
          if (fail)
          {
              if (this.LoginFailed != null)
              {
                  this.LoginFailed(this, EventArgs.Empty);
              }
          }
      }
      

      查看:

      ((MyViewModel)this.DataContext).LoginFailed += (sender, e) =>
          {
              // Code to close the window, such as window.Close();
          };
      

      【讨论】:

        【解决方案4】:

        您的 ViewModel 是您的 UI 状态的表示。您可以简单地暴露一个 IsLoginWindowVisible 布尔属性,然后您的视图可以有代码(是的,我说过,视图可以有代码!)根据该属性的状态显示/隐藏窗口。

        我认为人们对 MVVM 压力太大了。只要您的 ViewModel 可以在没有视图的情况下执行,为了方便测试,您就可以正确执行 MVVM。有代码来支持你的观点并没有错。

        【讨论】:

        • +1 我一直想知道的事情:人们从哪里得到在 MVVM 中视图中绝对不允许代码的想法?!这就像对某些人使用 goto,告诉他们在视图中编写代码一样。只要它与业务无关,恕我直言,它是通过子类化或附加行为向视图扩展和添加代码的最佳解决方案。
        • @dowhilefor 我不知道为什么人们会这么想!如果您使用 Blend 和设计时数据,则存在一些争论。但是,有多少人将 Blend 用于他们的 WPF 应用程序?
        • @dowhilefor 我总是受到我阅读的示例的影响,他们不断展示如何在没有任何代码隐藏和完美工作的情况下制作视图。有时我确实想知道如果我只是做一些黑客攻击并打破一些 MVVM 规则是否可以?但后来我一直认为人们写的例子应该是比我更好的解决方案lol
        • @ColinE 我确实曾经使用过 Blend,但是我真的很难为具有动态控件、连接控件和其他东西的 ACTUAL 应用程序工作......但我想知道......如果那是只是因为我在Blend方面不够熟练......
        • @ColinE +1 “是的,我说过,视图可以有代码!”。现在打电话给 MVVM 纯粹警察 ...
        猜你喜欢
        • 2011-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-04
        • 1970-01-01
        • 2015-10-26
        相关资源
        最近更新 更多