我正在编写一个具有4个 View 的程序: CompanyView , MembersView , WeeksView 和 ReportsView 。每个都有对应的ViewModel和Model。我已经使用PRISM BindableBase创建了ViewModels。数据正确绑定(bind)。
导航是通过MainWindow中的顶部按钮执行的,可以随时选择任何 View 。
Container.RegisterTypeForNavigation<CompanyView>("CompanyView");
Container.RegisterTypeForNavigation<MembersView>("MembersView");
Container.RegisterTypeForNavigation<WeeksView>("WeeksView");
Container.RegisterTypeForNavigation<ReportsView>("ReportsView");
问题是 WeeksViewModel 还必须有权访问成员ObservableCollection 。并且 ReportsViewModel 还必须有权访问公司 对象,成员ObservableCollection 和 Weeks ObservableCollection 。我不确定如何执行此操作。如何轻松地在ViewModel之间共享数据?
我已经尝试使用 PRISM IEventAggregator 来在更新它们时发布 ObservableCollections ,但这是可行的,但是必须先访问View才能监听事件。如果用户之前未单击“周” View ,则更新的 MembersCollection 将不会到达 WeeksView 。我可以预先初始化 View 吗?我该怎么做?
我遵循了 MVVM(通过Prism进行了简化)-网络研讨会(https://www.youtube.com/watch?v=ZfBy2nfykqY),发现注释中存在相同的问题。 Brian Lagunas建议解决此问题的唯一方法是通过导航参数:
我已经考虑过使用导航参数,但似乎您必须从WHERE到WHERE都在导航。例如。从 MembersView > WeeksView 中,将成员集合传递为参数。但是用户可以按任何顺序导航,包括在程序加载时直接导航到 WeeksView 。例如如果 WeeksView 来自公司 View ,如何获得成员集合?公司不了解成员(member)收藏。
我对其他想法持开放态度,我已经进行了广泛的研究,并完全陷入困境:-(
非常感谢您的想法和帮助!
亲切的问候,
达米安
最佳答案
您可以将单个 View 模型与每个特定 View 模型的属性结合使用,并在两个或多个 View 模型之间共享通用属性,例如:
class MainViewModel
{
public CompanyViewModel CompanyViewModel { get; set; }
public MembersViewModel MembersViewModel { get; set; }
public WeeksViewModel WeeksViewModel { get; set; }
public ObservableCollection<Members> Members { get; set; }
}
然后,每个 subview 都可以继承父窗口的DataContext
并绑定(bind)到所有 View 模型类型上它们想要的任何属性。另一种选择是使用直接引用,事件聚合器或共享服务在 View 模型之间来回传递信息。
但是,如果 View 模型仍然必须访问彼此的属性,那么拼命尝试将 View 模型之间的逻辑分开似乎是没有意义的。因此,我可能会选择第一种方法。