我有一个包含ObservableCollection的ViewModel。此系列一直在更新。现在我想与另一个ViewModel共享这个ObservableCollection。
VM1
//....Some Code
app.Use(async (context, next) =>
{
await next.Invoke();
if (context.Response.StatusCode == 302)
{
StringValues contentType;
if (context.Request.Headers.TryGetValue("Accept", out contentType)
&& contentType.Contains("application/json"))
{
context.Response.StatusCode = 401;
if (env.IsDevelopment())
await context.Response.WriteAsync("No Access");
}
}
});
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
现在我想在VM2中使用相同的ObservableCollection。我该怎么做呢? 我已经尝试创建一个新类,它包含我实现的ObservableCollection以获取Collection中的数据但是当我尝试从另一个VM获取它时它变为null。
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中的项目,但它返回空。
VM2
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);
}
}
}
我是WPF和MVVM的新手,那么在ViewModels之间共享ObservableCollections的正确方法是什么?
答案 0 :(得分:2)
根据这些信息,这里出了什么问题 在两个视图模型中,您都在创建SharedCollectionLayer的新对象。因此它们都有不同的实例,因此您没有从VM1获取值到VM2
<强>解决方案强>
解决此问题的方法是在两个视图模型之间共享单个对象。您可以按照下面的单例模式,或工厂模式,工厂决定为视图模型提供哪种模型
使您的SharedCollectionLayer成为单身人士,然后在两个视图模型中引用它 所以你会有这样的东西
public class SharedCollectionLayerSingleton
{
private static SharedCollectionLayerSingleton instance
public static SharedCollectionLayerSingleton Instance
{
if(instance == null)
{
instance = new SharedCollectionLayerSingleton()
}
return instance;
}
private SharedCollectionLayerSingleton()
{
// initialize here
}
}
在工厂方法中,您基本上可以让工厂创建模型或根据特定条件返回相同的模型。不要将视图模型作为条件,而是将应用程序的状态作为条件 我不知道你的收藏品是如何变化的,所以我无法评论什么是更好的方式。无论您遵循哪种模式,只要您想要同时反映变化的两个视图模型的视图,请确保将可观察集合保留在同一对象中。
希望这有帮助