【发布时间】:2018-02-22 07:17:37
【问题描述】:
我正在编写一个有 4 个视图的程序:CompanyView、MembersView、WeeksView 和 ReportsView。每个都有对应的 ViewModel 和 Model。我使用 PRISM BindableBase 来创建 ViewModel。数据绑定正确。
- CompanyViewModel 包含 Company 类型的 Object。
- MembersViewModel 包含 Member 对象的 ObservableCollection。
- WeeksViewModel 包含 Week 对象的 ObservableCollection。
通过主窗口中的顶部按钮执行导航,可以随时选择任何视图。
Container.RegisterTypeForNavigation<CompanyView>("CompanyView");
Container.RegisterTypeForNavigation<MembersView>("MembersView");
Container.RegisterTypeForNavigation<WeeksView>("WeeksView");
Container.RegisterTypeForNavigation<ReportsView>("ReportsView");
问题是 WeeksViewModel 必须也有权访问 Members ObservableCollection。 ReportsViewModel 必须也可以访问 Company Object、Members ObservableCollection 和Weeks ObservableCollection。
我不确定如何实现这一点。如何在 ViewModel 之间轻松共享数据?
我曾尝试使用 PRISM IEventAggregator 在更新时发布 ObservableCollections,这很有效,但是必须先访问视图才能收听事件。如果用户之前没有点击过“Weeks”视图,更新后的 MembersCollection 将不会到达 WeeksView。我可以预先初始化视图吗?我该怎么做?
我关注了 MVVM Made Simple with Prism - 网络研讨会 (https://www.youtube.com/watch?v=ZfBy2nfykqY) 并发现了在 cmets 中编写的相同问题。 Brian Lagunas 建议解决此问题的唯一方法是通过导航参数:
我在将消息从 ViewAViewModel 传递到 ViewBViewModel 时遇到了一个小问题。如果我没有访问 ViewB,它似乎不起作用,我认为这是因为 ViewBViewModel 尚未被实例化,直到它的视图至少被加载一次。
任何人对此有任何想法,我认为在需要之前实例化所有视图模型是一个坏主意,那么如何在实例化之前将默认信息从其他视图模型中获取到视图模型中?
Brian Lagunas:唯一的方法是在导航到 ViewBViewModel 时将该信息作为参数传递。
我考虑过使用导航参数,但您似乎必须知道从 WHERE 到 WHERE 的导航。例如。从 MembersView > WeeksView,将 Members Collection 作为参数传递。但用户可以按任何顺序导航,包括在程序加载时直接导航到 WeeksView。例如如果 WeeksView 来自 Company View,他们如何获得 Members Collection?公司不知道会员收藏。
我对其他想法持开放态度,我进行了广泛的研究并完全陷入困境:-(
非常感谢您的想法和帮助! 亲切的问候, 达米安
【问题讨论】:
-
出于好奇,用户是否可以同时打开不同的视图? IE。有没有办法让 WeeksView 和 MembersView 同时打开和可见?
-
您也可以使用 Prism 的region context。
-
你应该有一个主视图模型,它创建它的子视图模型并设置它们之间共享的任何东西。这种方法也简化了导航。您正面临由 PRISM 创建的人为问题。最简单的解决方案是不制造问题。
-
无需同时打开单独的视图。我喜欢主视图模型和子视图模型的想法。简单总是最好的。谢谢!
-
不客气,但请记住接受答案:meta.stackexchange.com/questions/23138/…