我正在使用MVVM,我知道数据的通信是View< => ViewModel< =>模型。
ViewModel可以使用双向绑定与View进行交互。
但是现在我有一个LoginView(在Window中),如果登录成功将在ViewModel中检查。
当它失败时,它应该告诉窗口关闭。但是......怎么样? ViewModel不应该知道View ....
答案 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();
}
}