在ViewModels之间共享observableCollection

时间:2015-12-07 23:29:11

标签: c# wpf mvvm observablecollection

我有一个包含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的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

根据这些信息,这里出了什么问题 在两个视图模型中,您都在创建SharedCollectionLayer的新对象。因此它们都有不同的实例,因此您没有从VM1获取值到VM2

<强>解决方案
解决此问题的方法是在两个视图模型之间共享单个对象。您可以按照下面的单例模式,或工厂模式,工厂决定为视图模型提供哪种模型

  1. 使您的SharedCollectionLayer成为单身人士,然后在两个视图模型中引用它 所以你会有这样的东西

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

  3. 希望这有帮助