在ViewModels之间共享observableCollection

本文关键字:observableCollection 共享 之间 ViewModels | 更新日期: 2023-09-27 18:26:06

我有一个ViewModel,它包含一个ObservableCollection。此集合一直在更新。现在我想与另一个ViewModel共享这个ObservableCollection。

VM1

public Class VM1
{
  private ObservableCollection<CameraPackage> _cameraPackagesPerScenes = new ObservableCollection<CameraPackage>();
    public ObservableCollection<CameraPackage> CameraPackagesPerScenes
    {
        get { return _cameraPackagesPerScenes; }
        set { _cameraPackagesPerScenes = value; RaisePropertyChanged(); }
    }
    public VM1
    {
           var SCFunctions = new SharedCollectionLayer();
           SCFunctions.AddToCameraPackagesPerSceneAndPartials(CameraPackagesPerScene);
    }
}

现在我想在VM2中使用相同的ObservableCollection。我该怎么做?我已经尝试创建一个新的类来保存我实现的ObservableCollection,以获取Collection中的数据,但当我尝试从其他VM获取数据时,它变为null。

public class SharedCollectionLayer
{
    private ObservableCollection<CameraPackage> _cameraPackagesPerScenes = new ObservableCollection<CameraPackage>();
    public ObservableCollection<CameraPackage> CameraPackagesPerScenes
        get { return _cameraPackagesPerScenes ; }
        set { _cameraPackagesPerScenes = value; RaisePropertyChanged(); }
    }
 }
 public ObservableCollection<CameraPackage> GetCameraPackagesPerSceneAndPartials()
    {
        var CameraPackagesPerScene = new ObservableCollection<CameraPackage>();
        foreach (CameraPackage camerapackage in CameraPackagesPerSceneAndPartials)
        {
            CameraPackagesPerScene.Add(camerapackage);
        }
        return CameraPackagesPerScene;
    }
    public void  AddToCameraPackages(ObservableCollection<CameraPackage> CameraPackagesPerScene)
    {
        foreach(CameraPackage camerapackage in CameraPackagesPerScene)
        {
            CameraPackagesPerSceneAndPartials.Add(camerapackage);
        }
    }
}

在VM2中,我试图获取observableCollection中的项,但它返回为空。

VM2

public Class VM2
{
    private ObservableCollection<CameraPackage> _cameraPackagesPerScene = new ObservableCollection<CameraPackage>();
    public ObservableCollection<CameraPackage> CameraPackagesPerScene 
    {
        get { return _cameraPackagesPerScene; }
        set { _cameraPackagesPerScene = value; RaisePropertyChanged(); }
    }
      public VM
      {
        var SCFunctions = new SharedCollectionLayer();
        CameraPackagesPerScene = SCFunctions.GetCameraPackagesPerSceneAndPartials();
       }
}

我对WPF和MVVM很陌生,那么在ViewModels之间共享ObservableCollections的正确方法是什么?

在ViewModels之间共享observableCollection

根据信息,以下是问题所在在这两个视图模型中,您都在创建SharedCollectionLayer的新对象。因此,它们都有不同的实例,因此您无法获得从VM1到VM2 的值

解决方案
解决这个问题的方法是在两个视图模型之间共享一个对象。您可以遵循下面的单例模式,也可以遵循工厂模式,在工厂模式中,工厂决定将哪个模型提供给视图模型

  1. 将SharedCollectionLayer设为singleton,然后在两个视图模型中引用它
    所以你会有这样的

    public class SharedCollectionLayerSingleton
    {
      private static SharedCollectionLayerSingleton instance
      public static SharedCollectionLayerSingleton Instance
      {
        if(instance == null)
        {
         instance = new SharedCollectionLayerSingleton()
        }
        return instance;
      }
      private SharedCollectionLayerSingleton()
      {
       // initialize here
      }
    }
    
  2. 在工厂方法中,基本上可以让工厂根据特定条件创建模型或返回相同的模型。不要将视图模型作为条件,而是将应用程序的状态作为条件
    我不知道你的收藏是如何变化的,所以我真的无法评论什么是更好的方式。无论您遵循哪种模式,只要您希望两个视图模型的视图同时反映更改,请确保将可观察的集合保持在同一对象中。

希望这能帮助