为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

潇潇雨雨 2019-07-06 13:04:53
视图模型应该如何关闭表单?我正在努力学习WPF和MVVM问题,但遇到了一个障碍。这个问题很相似,但不完全一样。作为这个(处理-对话-在-wpf-与-mvvm)...我有一个使用MVVM模式编写的“Login”表单。此表单具有一个ViewModel,它保存用户名和密码,这些用户名和密码使用常规数据绑定到XAML中的视图。它还有一个“Login”命令,它绑定到表单上的“Login”按钮,使用普通的数据绑定。当“Login”命令触发时,它将调用ViewModel中的一个函数,该函数将通过网络发送数据以登录。当此函数完成时,有两个操作:登录是无效的-我们只是显示一个MessageBox,一切都很好登录是有效的,我们需要关闭Login表单并让它返回true作为它的DialogResult...问题是,ViewModel对实际视图一无所知,那么它如何关闭视图并告诉它返回特定的DialogResult呢?我可以在CodeBeback中添加一些代码,并/或将视图传递到ViewModel,但这似乎会完全击败MVVM的全部要点.更新最后,我违反了MVVM模式的“纯度”,并让View发布了一个Closed事件,并公开Close方法。然后,ViewModel只需调用view.Close..视图仅通过接口已知,并通过IoC容器连接起来,因此不会丢失可测试性或可维护性。这似乎相当愚蠢,被接受的答案是-5票!虽然我很清楚一个人在“纯粹”的情况下解决一个问题所得到的美好感觉,但我并不是唯一一个认为200行事件、命令和行为只是为了避免以“模式”和“纯洁”为名的单行方法的人是有点可笑的。
查看完整描述

3 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

这里有很多评论讨论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中做同样的事情。

希望能帮上忙。


查看完整回答
反对 回复 2019-07-06
  • 3 回答
  • 0 关注
  • 488 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信