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

Two ViewModels are using one Model which holds data

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

我有两个 ViewModel MainViewModel 和 ListViewModel。 MainViewModel 有一个停靠面板,我想在其中有一个通用菜单来添加、删除项目和关闭应用程序等。 XAML 中还有一个显示 ListView 的用户控件。 ListView 包含几个 ObservableCollection<ProjectModel>.

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

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

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

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

所以我的问题是:我必须做什么,才能只处理传递给构造函数的 ListModel 的一个对象?

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

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

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