我正在尝试学习WPF和MVVM问题,但是遇到了麻烦。这个问题与这个问题相似(但不完全相同)。
我有一个使用MVVM模式编写的“登录”表单。
此表单具有一个ViewModel,其中包含用户名和密码,这些用户名和密码使用常规数据绑定绑定到XAML中的视图。它还具有一个“登录”命令,该命令绑定到表单上的“登录”按钮,使用常规数据绑定绑定。
当“ Login”命令触发时,它将调用ViewModel中的一个函数,该函数将关闭并通过网络发送数据以进行登录。完成此函数后,将执行2个操作:
登录名无效-我们只显示一个MessageBox,一切正常
登录名有效,我们需要关闭“登录名”表单,并让它返回true,因为它是
DialogResult
...
问题是,ViewModel对实际视图一无所知,那么如何关闭视图并告诉它返回特定的DialogResult?我可以在CodeBehind中粘贴一些代码,和/或将View传递给ViewModel,但这似乎将完全击败MVVM的整个方面。
更新资料
最后,我只是违反了MVVM模式的“纯度”,并让View发布了一个Closed
事件,并公开了一个Close
方法。然后,ViewModel将仅调用view.Close
。该视图仅通过接口已知,并通过IOC容器连接,因此不会丢失可测试性或可维护性。
接受的答案是-5票,似乎很愚蠢!虽然我很清楚通过“纯粹”解决问题会带来的良好感觉,但我当然不是唯一认为200行事件,命令和行为只是为了避免使用一种方法的人。 “模式”和“纯度”的名称有点荒谬。
Close
方法仍然是最佳解决方案。其他更复杂的对话框上的其他所有内容都是MVVM和数据绑定,但是在这里实现巨大的“解决方案”而不是简单的方法似乎很愚蠢……