等待窗口关闭并捕捉窗口事件

时间:2012-04-06 14:17:21

标签: wpf multithreading events mvvm

我有一个窗口,它的datacontext是一个viewmodel。现在,在vm和window(视图)的范围之外,我有一个将被调用的方法。该方法需要显示窗口并让用户更改一些内容,然后当用户完成时,窗口需要关闭并继续方法。棘手的是,我在窗口上的按钮绑定到viewmodel中的命令。这些命令触发'userCancelled'和'userOked'之类的事件。所以我想抓住这些事件,知道何时关闭窗口并继续使用该方法。

如果我使用ShowDialog,窗口上的

,事件没有被捕获(我假设因为线程被绑定等待对话框关闭)。但如果我使用Show,该方法就会继续。我需要等待。我已经尝试过Thread.Sleep,直到打开一些布尔值,但这也会占用线程并使窗口无法使用(使用.Show())。

我尝试过制作一个backgroundWorker,但我仍遇到同样的问题。

我知道我可以在按钮上使用代码隐藏,但是对于OK按钮,viewModel必须验证其状态是否有效。查看视图模型的视图会破坏MVVM的松散耦合风格,对吗?

我自己学习WPF和MVVM,我想做得对,并坚持在实用的好设计原则。我该怎么办?我究竟做错了什么?感谢。

1 个答案:

答案 0 :(得分:1)

您可以正确使用PrismWindowRegionAdapter执行此操作。

  1. 使用WindowRegionAdapter注册要显示/隐藏的视图(用户控件),以便在请求视图时,它将在新窗口中打开。
  2. 为显示/隐藏/关闭视图创建CompositePresentationEvents并将它们放入一些常见的基础架构程序集中。
  3. 在包含视图的模块的Initialize方法中,订阅在2中创建的事件,并将它们链接到OnShow / OnHide / OnClose事件处理程序。
  4. 在事件处理程序中,您可以使用Prism区域管理器添加/删除区域中的视图,该区域将依次显示/隐藏/关闭窗口。您可以修改WindowRegionAdapter以完全按照您的意愿执行操作。
  5. 然后,只要您想要显示/隐藏视图,您就可以在任何地方(无论您使用哪个模块/视图模型)发布相应的显示/隐藏事件,并在订阅事件的模块中调用相应的事件处理程序,窗口将显示为隐藏。
  6. 是的,它稍微复杂但绝对值得投资,特别是如果你还需要打开其他窗户。让事情变得非常干净。