MVVM UserControl活动非活动状态

时间:2016-05-24 10:58:28

标签: c# wpf mvvm user-controls mvvm-light

我还在学习MVVM模式,我正在使用MVVMLight,我遇到了这个问题:

让我们说,我有两个不同的视图模型A和B,它们是我的应用程序中的页面,并且它们一直处于活动状态。此外,还有一项服务只通过信使发送消息。

A和B都订阅了那些信使通知。 但是,当时窗口上只显示了1个viewmodel(此场景中的页面)。我在主窗口上放置了两个按钮,每个视图模型A或B一个,所以我可以随时去viewmodel A或viewmodel B.他们不会处置,只是“隐藏”。

(我正在使用类似Rachel Lim's post的CurrentViewModel方法。我使用它是因为我发现它简单而有用。如果你知道更好的方法,我很乐意听到它。)

现在,由于只有1个视图模型是“活动的”,我不希望对方接收这些消息。 如果当前页面是Viewmodel A,我不希望viewmodel B接收消息。

这是我尝试过的:

  • 我想,要从信使通知中取消订阅“非活动”视图模型,但是,如何知道视图模型何时变为“非活动”状态?

  • 我还想过,在视图模型“IsActive”或类似的东西中创建一个属性,然后当shell viewmodel中的CurrentViewModel发生变化时,进行迭代,将每个viewmodel“IsActive”属性变为false,除了'主动'视图模型。但是,如果我的视图模型不在列表中呢?我认为这将是如此笨重和不恰当,必须有一个更好的方法。

  • 然后我想起了Sacha Barber的Cinch Series,并引起了我的注意View Lifetime Behaviors,我喜欢这种方法,因为他知道已加载,已卸载,已激活和已停用的事件,但是,在UserControl(这是我的带有DataTemplate的页面)中,激活和取消激活不可用。

所以:

1)通知视图模型它是CurrentViewModel的最佳做法是什么?

2)并在导航模式中禁用非CurrentViewModel的信使通知(如Rachel的,或者如果你知道更好的,请告诉我调查它。)

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

如何向窗口发送一条消息,说明哪个是最新的,并在窗口中跟踪谁是当前视图/视图模型。

答案 1 :(得分:0)

使用自定义消息类的两个想法:

1)消息的发件人是否知道哪个viewmodel处于活动状态?消息有效负载的一部分可以包含哪个视图模型来处理它。每个视图模型在接收到消息时可以检查有效载荷以查看是否要处理该消息。但是,效率低下,因为非活动视图模型仍然会收到消息。

2)您可以创建一个“ActiveMessage”自定义消息类,其中有效负载是viewmodel处于活动状态并从shell发送的。每个viewmodel都保持订阅此消息类。收到每个“ActiveMessage”后,如果它是为viewmodel调用一个“RegisterForMessages”方法 - 它为所需的所有其他消息类型注册viewmodel。稍后,当它收到带有不同viewmodel的“ActiveMessage”消息时,它会调用“UnregisterForMessages()”方法,该方法在消息“非活动”时取消注册。