繁体   English   中英

两个ViewModel使用一个保存数据的模型

[英]Two ViewModels are using one Model which holds data

我搜索了将近3个小时,发现了大量有关PRISM和VM数据共享的信息,但是我无法理解。

我有两个ViewModels MainViewModel和ListViewModel。 MainViewModel有一个底座面板,例如,我要在其中有一个通用菜单来添加,删除项目和关闭应用程序。 XAML中还有一个用户控件,其中显示了ListView。 ListView包含一些ObservableCollection<ProjectModel>

我想从MainVM中添加更多项目-因此要添加到集合中。 要访问包含数据的ListModel,我将其传递给两个ViewModels的构造函数:

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

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

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

所以我的问题是:我要做什么,仅要处理传递给构造函数的ListModel的一个对象?

与往常一样,您有两个选择:

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

我会选择第二个,因为它更灵活-您可以在其他地方使用具有不同内容的其他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 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM