【问题标题】:MVVM UserControl Active Inactive StateMVVM 用户控件活动非活动状态
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 嗨。是的,在 shell 窗口中跟踪 CurrentViewModel 是 Rachel 的示例的工作方式。但是,在 shell 窗口上不会收到信使通知,而是在两个视图模型中都收到。如果视图模型不是 shell 中的当前模型,则它必须不接收通知。这就是我尝试添加属性“IsActive”的原因,如果 IsActive == False,则忽略通知。感谢您的宝贵时间。
    【解决方案2】:

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

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

    2) 您可以创建一个“ActiveMessage”自定义消息类,其有效负载是哪个视图模型处于活动状态并从外壳发送。每个视图模型都订阅此消息类。在接收到每个“ActiveMessage”时,如果它是针对视图模型的,则调用“RegisterForMessages”方法——该方法为它需要的所有其他消息类型注册视图模型。稍后,当它接收到具有不同视图模型的“ActiveMessage”消息时,它会调用“UnregisterForMessages()”方法,该方法在消息“非活动”时从消息中注销。

    【讨论】:

    • 嗨。您的第一个想法是我之前想到的,经过思考后,我意识到非活动视图模型将始终收到该消息。这就是为什么我想要另一个角度,但没有运气。由于我还在学习,我完全不能理解你的第二个想法,我会考虑一段时间,直到我明白为止。也许将来有用。感谢您的宝贵时间。
    猜你喜欢
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多