C# 如何与多个ViewModels共享多个ObservableCollection?

C# 如何与多个ViewModels共享多个ObservableCollection?,c#,.net,wpf,mvvm,prism,C#,.net,Wpf,Mvvm,Prism,我正在编写一个包含4个视图的程序:公司视图、成员视图、周视图和报告视图。每个都有相应的ViewModel和Model。我已经使用PRISM BindableBase创建了ViewModels。数据绑定正确 CompanyViewModel包含类型为Company的对象 成员查看模型包含成员对象的可观察集合 WeeksViewModel包含一个可观察的周对象集合 通过主窗口中的顶部按钮执行导航,可随时选择任何视图 Container.RegisterTypeForNavigation(“公司视

我正在编写一个包含4个视图的程序:公司视图成员视图周视图报告视图。每个都有相应的ViewModel和Model。我已经使用PRISM BindableBase创建了ViewModels。数据绑定正确

  • CompanyViewModel包含类型为Company的对象
  • 成员查看模型包含成员对象的可观察集合
  • WeeksViewModel包含一个可观察的周对象集合
通过主窗口中的顶部按钮执行导航,可随时选择任何视图

Container.RegisterTypeForNavigation(“公司视图”);
Container.RegisterTypeForNavigation(“MembersView”);
Container.RegisterTypeForNavigation(“周视图”);
Container.RegisterTypeForNavigation(“ReportsView”);
问题是WeeksViewModel还必须访问成员ObservableCollection。而报告视图模型还必须能够访问公司对象成员可观察集合周可观察集合

我不知道如何实施这一点。如何在ViewModels之间轻松共享数据

我曾尝试使用PRISM IEventAggregator在更新时发布可观察到的集合,这是可行的,但是必须先访问视图,然后才能侦听事件。如果用户以前没有单击过“周”视图,则更新的成员集合将不会到达周视图。我可以预先初始化视图吗?我该怎么做

我遵循了通过Prism-Webinar(Prism-Webinar)简化的MVVM,并在评论中发现了同样的问题。Brian Lagunas建议,解决这一问题的唯一方法是通过导航参数:

UpdateEvent将消息从ViewAViewModel传递到ViewBViewModel时出现了一个小问题。如果我没有访问ViewB,它似乎不起作用,我假设这是因为ViewBViewModel在至少加载一次视图之前还没有被实例化

任何人对此有任何想法,我假设在需要之前实例化所有viewmodel都是一个坏主意,那么如何在实例化之前从其他viewmodel将默认信息导入viewmodel呢

Brian Lagunas:唯一的方法是在导航到ViewBViewModel时将该信息作为参数传递

我曾考虑过使用导航参数,但似乎您必须知道从何处导航到何处。例如,从成员视图周视图,将成员集合作为参数传递。但用户可以按任何顺序导航,包括在加载程序时直接导航到WeeksView。e、 g.周视图如何获取成员集合(如果他们来自公司视图)?公司不知道有关成员集合的信息

我对其他想法持开放态度,我进行了广泛而深入的研究,完全被困在其中:-(

非常感谢您的想法和帮助! 亲切问候,, 达米安

问题是WeeksViewModel还必须有权访问Members ObservableCollection。ReportsViewModel还必须有权访问Company对象、Members ObservableCollection和Weeks ObservableCollection

我不知道如何实现这一点。如何在ViewModels之间轻松共享数据

您可以使用单个视图模型,其中包含每个特定视图模型的属性以及要在两个或多个视图模型之间共享的公共属性,例如:

class MainViewModel
{
    public CompanyViewModel CompanyViewModel { get; set; }
    public MembersViewModel MembersViewModel { get; set; }
    public WeeksViewModel WeeksViewModel { get; set; }

    public ObservableCollection<Members> Members { get; set; }
}
class主视图模型
{
公共公司视图模型公司视图模型{get;set;}
public MembersViewModel MembersViewModel{get;set;}
公共WeekViewModel WeekViewModel{get;set;}
公共ObservableCollection成员{get;set;}
}
然后,每个子视图都可以继承父窗口的
DataContext
,并在所有视图模型类型中绑定到它们想要的任何属性

另一种选择是使用直接引用、事件聚合器或共享服务在视图模型之间来回传递信息


但是,如果视图模型仍然必须访问彼此的属性,那么拼命尝试将它们之间的逻辑分离似乎是毫无意义的。因此,我可能会选择第一种方法。

我建议让
公司
可观测集合
可观测集合
来自一个或多个服务冰


WeeksViewModel
然后从服务接收
ObservableCollection
ObservableCollection
并处理数据以供
周视图
使用。
报告视图模型
处理
公司
可观察到的收集
可观察到的收集
以供
报告视图
使用……如果有人添加了
成员
,他会通过拥有的服务来实现这一点ode>ObservableCollection,以及从该服务接收到该
ObservableCollection
的所有视图模型将收到通知并相应更新

不需要在视图模型之间传递数据,因为视图模型并不拥有数据。它们所做的只是从某个数据源转换数据以显示视图,另一种方式是将用户操作转换为对修改数据的服务的调用

当您拥有拥有数据的视图模型时,您会在视图模型上获得类似于
UpdateData
的方法,最终您会得到
class MainViewModel
{
    public CompanyViewModel CompanyViewModel { get; set; }
    public MembersViewModel MembersViewModel { get; set; }
    public WeeksViewModel WeeksViewModel { get; set; }

    public ObservableCollection<Members> Members { get; set; }
}