我正在编写一个具有4个 View 的程序: CompanyView MembersView WeeksView ReportsView 。每个都有对应的ViewModel和Model。我已经使用PRISM BindableBase创建了ViewModels。数据正确绑定(bind)。

  • CompanyViewModel 包含类型为公司的对象。
  • MembersViewModel 包含成员对象的ObservableCollection。
  • WeeksViewModel 包含对象的ObservableCollection。

  • 导航是通过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 模型之间的逻辑分开似乎是没有意义的。因此,我可能会选择第一种方法。

    10-08 00:24