2015-12-08 3 views
0

Я поделился наблюдаемым набором между двумя ViewModels. Когда я запускаю viewmodel, наблюдаемые выделения в обеих моделях ViewModels работают нормально, но когда я вношу изменения в источник ObservableCollection, он не обновляет его в ObservableCollection во второй ViewModel. Как я могу сделать второе наблюдение, чтобы получить изменения, сделанные в первом ObservableCollection.Обновление ObservableCollection между режимами просмотра

VM 1

public Class VM1 
{ 
    private ObservableCollection<CameraPackage> _cameraPackagesPerScene = new ObservableCollection<CameraPackage>(); 
    public ObservableCollection<CameraPackage> CameraPackagesPerScene 
    { 
     get { return _cameraPackagesPerScene; } 
     set { _cameraPackagesPerScene = value; RaisePropertyChanged(); } 
    } 
} 

VM2

public Class VM2 
{ 
    public ObservableCollection<CameraPackage> CameraPackagesPerSceneAndPartials { get; set; } 

    public VM2 (VM1 vm1) 
    { 
      CameraPackagesPerSceneAndPartials = new ObservableCollection<CameraPackage>(vm1.CameraPackagesPerScene); 
    } 
} 
+0

Вы не должны передавать ViewModels в другой конструктор ViewModels, упрощает тестирование и заставляет их плотно соединяться. Подумайте о том, чтобы использовать сборщик сообщений/сообщений/агрегатор событий для обмена такими изменениями между представлениями – Tseng

+0

Используете ли вы какую-либо структуру mvvm? –

+0

@IgorQuirino Я использую galasoft mvvmlight – Phil

ответ

0

Вы не должны создавать новые ObservableCollection на основе других ОС. Просто использовать один экземпляр для обоих ViewModels:

public VM2 (VM1 vm1) 
{ 
     CameraPackagesPerSceneAndPartials = vm1.CameraPackagesPerScene; 
} 

Или вводить только коллекцию второй ViewModel:

public VM2 (ObservableCollection<CameraPackage> cameraPackagesPerSceneAndPartials) 
{ 
     CameraPackagesPerSceneAndPartials = cameraPackagesPerSceneAndPartials; 
} 

Другой способ уменьшить связи заключается в том, чтобы с помощью EventAggregator или другого event-based patterns.

0

Вы можете использовать mvvmlight messenger для обмена сообщениями из режимов просмотра.

Это прекрасный способ сделать это. См ниже пример:

SENDING:

// Sends a notification message with a Person as content. 
var person = new Person { FirstName = "Marco", LastName = "Minerva" }; 
Messenger.Default.Send(new NotificationMessage<Person>(person, "Select")); 

ПОЛУЧЕНИЕ:

// Registers for incoming Notification messages. 
Messenger.Default.Register<NotificationMessage<Person>>(this, (message) => 
{ 
    // Gets the Person object. 
    var person = message.Content; 

    // Checks the associated action. 
    switch (message.Notification) 
    { 
        case "Select": 
            break; 
        case "Delete": 
            break; 
        default: 
            break; 
    } 
}); 

ОТ Tutorial:

https://marcominerva.wordpress.com/2014/06/25/how-to-send-string-and-content-messages-with-mvvm-light-messenger/

Смежные вопросы