两个viewmodel使用一个保存数据的Model

本文关键字:保存 一个 数据 Model viewmodel 两个 | 更新日期: 2023-09-27 18:18:09

我已经搜索了将近3个小时,发现了很多关于PRISM和VM数据共享的内容,但我的大脑无法理解它。

我有两个ViewModels MainViewModel和ListViewModel。MainViewModel有一个dockpanel,我想有一个公共菜单来添加,删除项目和关闭应用程序。在XAML中还有一个显示ListView的用户控件。ListView包含一些ObservableCollection<ProjectModel> .

从MainVM我想添加更多的项目-所以到一个集合。为了访问包含数据的ListModel,我将它传递给两个ViewModels的构造函数:

public MainModuleViewModel(ListModel listModel)
        {
            ListModel = listModel;
            InitializeCommands();
        }
public ListModuleViewModel(ListModel listModel)
        {
            ListModel = listModel;
            InitializeCommands();
        }

但是似乎在初始化ListModel的过程中创建了不同的对象。

所以我的问题是:我要做什么,只在ListModel的一个对象上工作,我传递给构造函数?

两个viewmodel使用一个保存数据的Model

一如既往,您有两个选择:

  • 注册ListModel为单例(ContainerControlledLifetimeManager在Unity中)
  • 或将服务注册为单例,将数据提供给视图模型

我会去第二个,因为它更灵活-你可以在其他地方使用不同的ListModel实例与不同的内容,你可以让服务给每个视图模型自己的实例(虽然具有相同的内容),或者你可以让它给每个视图模型相同的实例等等…

public interface IDatasource
{
    ListModel Data { get; }
}
internal class StephensService : IDatasource
{
    ListModel Data { get; } = new ListModel(); // or however you plan to procure the data
}
// ... bootstrapper / module initialization ...
Container.RegisterType<IDatasource, StephensService>( new ContainerControllerLifetimeManager() );
// ...
internal class ListModuleViewModel
{
    public ListModuleViewModel( IDatasource datasource )
    {
         var heresMyData = datasource.Data;
    }
}

根据您的需要,服务可以实现INotifyPropertyChangedListModel可以是ObservableCollection