1

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

如果我使用 ShowDialog 在窗口上,则不会捕获事件(我假设因为线程被捆绑等待对话框关闭)。但是,如果我使用 Show,该方法将继续运行。我需要它等待。我已经尝试过 Thread.Sleep,直到打开了某个布尔值,但这也会占用线程并使窗口不可用(使用 .Show())。

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

我知道我可以在按钮上使用代码隐藏,但是对于 OK 按钮,viewModel 必须验证其状态是否有效。让视图与视图模型协商违背了 MVVM 松散耦合风格的观点,对吗?

我正在自己学习 WPF 和 MVVM,我想把它做好,并在可行的情况下坚持良好的设计原则。我该怎么做?我究竟做错了什么?谢谢。

4

1 回答 1

1

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

  1. 使用 WindowRegionAdapter 注册要显示/隐藏的视图(用户控件),以便在请求视图时在新窗口中打开。
  2. 为视图的显示/隐藏/关闭创建 CompositePresentationEvents,并将它们放在一些常见的基础结构组件中。
  3. 在包含视图的模块的 Initialize 方法中,订阅在 2 中创建的事件并将它们链接到 OnShow/OnHide/OnClose 事件处理程序。
  4. 在事件处理程序中,您可以使用 Prism 区域管理器从该区域添加/删除视图,这将依次显示/隐藏/关闭窗口。您可以修改 WindowRegionAdapter 以精确地执行您希望它执行的操作。
  5. 然后,每当您想显示/隐藏视图时,您可以简单地在任何地方(在任何模块/视图模型中)发布适当的显示/隐藏事件,并且将在订阅事件的模块中调用适当的事件处理程序,窗口将是显示为隐藏。

是的,它有点复杂,但绝对值得投资,特别是如果您还需要打开其他窗口。保持东西非常干净。

于 2012-04-06T14:49:59.963 回答