Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何让视图知道必须关闭窗口?_C#_Wpf_Mvvm - Fatal编程技术网

C# 如何让视图知道必须关闭窗口?

C# 如何让视图知道必须关闭窗口?,c#,wpf,mvvm,C#,Wpf,Mvvm,我使用的是MVVM,据我所知,数据的通信是视图模型 ViewModel可以使用双向绑定与视图交互 但现在我有一个登录视图,它在一个窗口中,如果登录成功,将签入ViewModel 当它失败时,它应该告诉窗口关闭。但是…怎么做?ViewModel不应该知道视图。…您的ViewModel是UI状态的表示。您可以简单地公开一个IsLoginWindowVisible布尔属性,然后您的视图可以有代码是的,我说过了,视图可以有代码!根据此属性的状态显示/隐藏窗口的 我认为人们过于强调MVVM。只要您的Vie

我使用的是MVVM,据我所知,数据的通信是视图模型

ViewModel可以使用双向绑定与视图交互

但现在我有一个登录视图,它在一个窗口中,如果登录成功,将签入ViewModel


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

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


我认为人们过于强调MVVM。只要您的ViewModel可以在没有视图的情况下执行,为了便于测试,您就可以正确地执行MVVM。有代码来支持您的视图没有什么错。

我在这里简单介绍一下,并使用事件通知视图它应该关闭

视图模型:

public event EventHandler LoginFailed;

public void Login()
{
    if (fail)
    {
        if (this.LoginFailed != null)
        {
            this.LoginFailed(this, EventArgs.Empty);
        }
    }
}
视图:


您应该向ViewModel添加一个特定事件,例如LoginFailed。然后,您应该将此事件链接到关闭窗口的命令。请参阅有关如何链接两者的博客文章。

这里是另一个选项。您可以使用委托,而不是使用事件:

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

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

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

触发事件并让视图响应它?可能重复。我们倾向于打破通常的MVVM规则,我们的WindowViewModel知道它的窗口,否则将很难正确处理窗口。此后,我们再也不会从ViewModels中接触视图,它工作得很好。@docomg,答案是genius lol感谢+1。我一直在想:人们从哪里知道MVVM中绝对不允许在视图中使用代码?!这就像对某些人使用goto,告诉他们在视图中编写代码。只要它与业务无关,它的imho就完全有效,是通过子类化或附加行为来扩展和向视图中添加代码的最佳解决方案。@dowhilefor我不知道人们为什么会这样想!如果使用混合和设计时数据,会有一些争论。然而,有多少人在他们的WPF应用程序中使用Blend?@Dowhilef因为我总是被我读到的示例所影响,他们一直在展示他们如何在没有任何代码的情况下创建视图,并完美地工作。有时我真的想知道,如果我只是做一些黑客,打破一些MVVM规则,这是好的吗?但是我总是认为人们写的例子应该比我更好lol@ColinE我确实使用过Blend,但对于我来说,在实际的应用程序中使用动态控件、连接控件和不同的东西是非常困难的。。。但是我想知道。。如果这只是因为我在混合方面不够熟练……@ColinE+1是的,我说了,视图可以有代码!。现在给MVVM纯粹主义者警察打电话。。。
public class View {
    ...
    myViewModel.OnFail = () => {this.Close();};
    ...
}

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

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