2015-12-07 5 views
1

У меня есть ViewModel, который содержит ObservableCollection. Эта коллекция постоянно обновляется. Теперь я хочу поделиться этим ObservableCollection с другим ViewModel.share observableCollection from ViewModels

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); 
    } 
} 

Теперь я хочу, чтобы использовать тот же ObservableCollection в VM2. Как мне это сделать? Я уже пытался создать новый класс, который содержит ObservableCollection, который я получаю, чтобы получить данные в коллекции, но когда я пытаюсь получить его из другой виртуальной машины, он становится нулевым.

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 Я пытаюсь получить элементы в наблюдаемом наборе, но он возвращает пустой.

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, так, что это правильный подход совместного использования ObservableCollections между ViewModels?

+0

Я не понимаю ваш SharedCollectionLayer. В функции GetCameraPackagesPerSceneAndPartials, где инициализируется CameraPackagesPerSceneAndPartials? Кроме того, вы хотите, чтобы оба режима просмотра были синхронизированы? Значение, когда новый элемент добавлен в camerapackagespersen в vm2, вы хотите, чтобы он отражался и в vm1? –

+0

@MonilGandhi Я обновил VM1, чтобы показать, как я получаю данные из наблюдаемого коллекционирования в sharedCollectionLayer. Этот шаг работает, но когда я пытаюсь получить его в VM2, он каким-то образом опустошает коллекцию в sharedCollectionLayer. – Phil

ответ

2

На основании информации, вот что является неправильным В обеих моделях вашего просмотра вы создаете новые объекты SharedCollectionLayer. Так как они имеют разные экземпляры и, следовательно, вы не получаете значение от VM1 до VM2

Solution
способа решить эту проблему, чтобы иметь один объект разделяется между обеими моделями представления. Вы можете следовать шаблону одноплодного ниже, или шаблону фабрики, где завод решает, какая модель придать модели вида

  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. В фабричный метод, вы можете в основном иметь завод создать модель или вернуть ту же модель, основанную на определенных условиях. У вас нет моделей просмотра в качестве условий, кроме состояния вашего приложения.
    Я не знаю, как меняется ваша коллекция, поэтому я не могу комментировать, что лучше. Независимо от того, какой шаблон вы следите за тем, чтобы сохранить наблюдаемую коллекцию в одном и том же объекте, если вы хотите, чтобы одновременно отображались представления обеих моделей, отражающих изменение.

Надеется, что это помогает