在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的正确方法是什么?
根据信息,以下是问题所在在这两个视图模型中,您都在创建SharedCollectionLayer的新对象。因此,它们都有不同的实例,因此您无法获得从VM1到VM2 的值
解决方案
解决这个问题的方法是在两个视图模型之间共享一个对象。您可以遵循下面的单例模式,也可以遵循工厂模式,在工厂模式中,工厂决定将哪个模型提供给视图模型
-
将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 } }
-
在工厂方法中,基本上可以让工厂根据特定条件创建模型或返回相同的模型。不要将视图模型作为条件,而是将应用程序的状态作为条件
我不知道你的收藏是如何变化的,所以我真的无法评论什么是更好的方式。无论您遵循哪种模式,只要您希望两个视图模型的视图同时反映更改,请确保将可观察的集合保持在同一对象中。
希望这能帮助