如何让View知道它必须关闭Window?

时间:2012-01-19 16:40:48

标签: c# wpf mvvm

我正在使用MVVM,我知道数据的通信是View< => ViewModel< =>模型。

ViewModel可以使用双向绑定与View进行交互。

但是现在我有一个LoginView(在Window中),如果登录成功将在ViewModel中检查。

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

4 个答案:

答案 0 :(得分:7)

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

我认为人们对MVVM的压力过大。只要您的ViewModel可以在没有视图的情况下执行,为了便于测试,您正在正确地执行MVVM。使用代码来支持您的视图没有任何问题。

答案 1 :(得分:0)

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

视图模型:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

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