代码之家  ›  专栏  ›  技术社区  ›  FredM d.moncada

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

  •  0
  • FredM d.moncada  · 技术社区  · 8 年前

    我搜索了近3个小时,找到了很多关于棱镜和虚拟机数据共享的信息,但我的大脑无法理解。

    我有两个视图模型MainViewModel和ListViewModel。MainViewModel有一个dockpanel,我希望在其中有一个公共菜单来添加、删除项目和关闭应用程序。XAML中还有一个显示列表视图的用户控件。ListView包含一些 ObservableCollection<ProjectModel> .

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

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

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

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Haukinger    8 年前

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

    • 注册 ListModel 作为独生子女( ContainerControlledLifetimeManager 统一)
    • 或者将服务注册为将数据提供给视图模型的单例

    我会选择第二个,因为它更灵活——你可以使用不同的 列表模型 实例,您可以使服务为每个视图模型提供其自己的实例(尽管具有相同的内容),也可以使它为每个视图模式提供相同的实例,等等。。。

    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 列表模型 可以是 ObservableCollection ...