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

时间:2016-11-16 16:02:47

标签: c# wpf mvvm prism

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

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

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

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

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

但似乎在初始化期间创建了ListModel的不同对象。

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

1 个答案:

答案 0 :(得分:1)

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

  • 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;
    }
}

根据您的需要,该服务可以实施INotifyPropertyChanged,或ListModel可以是ObservableCollection ...