我正在尝试学习WPF和MVVM模式,但遇到了一个问题。这个问题类似于此问题(在WPF中处理对话框),但并不完全相同...
我使用MVVM模式编写了一个“登录”表单。
该表单有一个ViewModel来保存用户名和密码,并使用正常的数据绑定将它们绑定到XAML视图上。还有一个“Login”命令,使用正常的数据绑定将其绑定到表单上的“Login”按钮。
当“Login”命令触发时,它会调用ViewModel中的一个函数,该函数会发送数据经过网络进行登录。当该函数完成时,会出现两种情况:
登录无效-我们只需弹出一个消息框就可以了
登录有效,我们需要关闭登录窗口并返回true作为它的
DialogResult
。
问题是,ViewModel对实际视图一无所知,那么它如何关闭视图并告诉它返回特定的DialogResult??我可以在CodeBehind中添加一些代码,或者将视图传递给ViewModel,但这似乎会完全破坏MVVM的整个目的...
更新
最终,我打破了MVVM模式的“纯洁性”,使View发布了一个Closed
事件,并公开了一个Close
方法。然后ViewModel只需调用view.Close
. View仅通过接口知道,并通过IOC容器连接,因此没有失去可测试性或可维护性。
看起来,被接受的答案获得-5票似乎相当愚蠢!虽然我十分清楚在保持“纯粹”的同时解决问题所带来的好感,但我肯定不是唯一一个认为200行事件、命令和行为只为了避免使用一个一行代码的方法而使用“模式”和“纯洁性”有点荒谬的人...