【发布时间】:2016-05-24 10:58:27
【问题描述】:
我还在学习MVVM模式,我用的是MVVMLight,结果遇到了这个问题:
假设我有 2 个不同的视图模型 A 和 B,它们是我的应用程序中的页面,并且它们一直处于活动状态。此外,还有一项服务只是通过信使发送消息。
A 和 B 都订阅了这些信使通知。 然而,当时只有 1 个视图模型(本场景中的页面)显示在窗口上。我在主窗口上放置了两个按钮,每个视图模型 A 或 B 一个,所以我可以随时转到视图模型 A 或视图模型 B。他们不处置,只是“隐藏”。
(我正在使用像 Rachel Lim's post 这样的 CurrentViewModel 方法。我使用它是因为我发现它简单实用。如果您知道更好的方法,我很高兴听到它。)
现在,由于只有 1 个视图模型处于“活动状态”,我不希望另一个视图模型接收这些消息。 如果当前Page是Viewmodel A,我不希望viewmodel B收到消息。
这是我尝试过的:
我想从信使通知中取消订阅“非活动”视图模型,但是,我如何知道视图模型何时变为“非活动”状态?
我也想过,在视图模型“IsActive”或类似的东西中创建一个属性,然后当外壳视图模型中的 CurrentViewModel 发生变化时,进行迭代,将每个视图模型“IsActive”属性设置为 false,除了“活动”视图模型。但是,如果我的视图模型不在列表中怎么办?我认为这样既笨拙又不恰当,一定有更好的方法。
然后我想起了来自 Sacha Barber 的 Cinch Series,并引起了我的注意 View Lifetime Behaviors,我喜欢这种方法,因为在 UserControl (这是我的带有 DataTemplate 的页面),Activated 和 Deactivated 不可用。
所以:
1) 通知视图模型它是 CurrentViewModel 的最佳做法是什么?
2) 并在导航模式中禁用对非 CurrentViewModel 的信使通知(如 Rachel 的,或者如果你知道更好的,请告诉我调查它)。
感谢您的宝贵时间。
【问题讨论】:
标签: c# wpf mvvm user-controls mvvm-light