视图模型应该如何关闭表单?

视图模型应该如何关闭表单?

我正在努力学习WPF和MVVM问题,但遇到了一个障碍。这个问题很相似,但不完全一样。作为这个(处理-对话-在-wpf-与-mvvm)...

我有一个使用MVVM模式编写的“Login”表单。

此表单具有一个ViewModel,它保存用户名和密码,这些用户名和密码使用常规数据绑定到XAML中的视图。它还有一个“Login”命令,它绑定到表单上的“Login”按钮,使用普通的数据绑定。

当“Login”命令触发时,它将调用ViewModel中的一个函数,该函数将通过网络发送数据以登录。当此函数完成时,有两个操作:

  1. 登录是无效的-我们只是显示一个MessageBox,一切都很好

  2. 登录是有效的,我们需要关闭Login表单并让它返回true作为它的DialogResult...

问题是,ViewModel对实际视图一无所知,那么它如何关闭视图并告诉它返回特定的DialogResult呢?我可以在CodeBeback中添加一些代码,并/或将视图传递到ViewModel,但这似乎会完全击败MVVM的全部要点.


更新

最后,我违反了MVVM模式的“纯度”,并让View发布了一个Closed事件,并公开Close方法。然后,ViewModel只需调用view.Close..视图仅通过接口已知,并通过IoC容器连接起来,因此不会丢失可测试性或可维护性。

这似乎相当愚蠢,被接受的答案是-5票!虽然我很清楚一个人在“纯粹”的情况下解决一个问题所得到的美好感觉,但我并不是唯一一个认为200行事件、命令和行为只是为了避免以“模式”和“纯洁”为名的单行方法的人是有点可笑的。


潇潇雨雨
浏览 508回答 3
3回答

明月笑刀无情

这里有很多评论讨论MVVM的利弊。对我来说,我同意Nir的观点;这是一个恰当地使用模式的问题,而且MVVM并不总是合适的。人们似乎已经愿意牺牲软件设计的所有最重要的原则,只是为了使它适合MVVM。尽管如此.我认为你的案子很适合做一些重构。在我遇到的大多数情况下,WPF使您能够在没有多个Window也许你可以试着用FrameS和PageS而不是Windows与DialogResultS.就你的情况而言,我的建议是LoginFormViewModel处理LoginCommand如果登录无效,则将属性设置为LoginFormViewModel到适当的值(false或者某些枚举值UserAuthenticationStates.FailedAuthentication)。对于成功的登录,您也会这样做(true或其他枚举值)。然后使用DataTrigger,它响应不同的用户身份验证状态,并且可以使用一个简单的Setter更改Source的属性Frame.让您的登录窗口返回DialogResult我想这就是你感到困惑的地方DialogResult实际上是ViewModel的一个属性。在我使用WPF的有限经验中,当某些事情感觉不对劲时,通常是因为我在考虑如何在WinForms中做同样的事情。希望能帮上忙。
打开App,查看更多内容
随时随地看视频慕课网APP