Связь между моделями представления, совмещенная с системой iNotifyPropertyChanged - PullRequest
0 голосов
/ 28 декабря 2011

Я использую MVVM, и я хотел бы общаться между viewmodels.У меня есть пользовательский элемент управления, который содержит другой пользовательский элемент управления внутри него, и я хотел бы, чтобы родительский пользовательский элемент управления запускал некоторый код при изменении свойства в дочернем элементе.Я видел несколько способов обмена данными между моделями представления, например, используя MVVM Light Messenger или PRISM Event Aggregator, но я надеялся, что есть какой-то способ сделать это, просто подписавшись на событие PropertyChanged, вызванное реализацией INotifyPropertyChanged.

Ответ Мэтта Хэмилтона есть в этой записи , но у меня возникли проблемы с его реализацией, поскольку для него требуется объект DependencyObject, а мои ViewModels являются POCO, а не DO *есть какой-то способ использования системы INotifyPropertyChanged, так как я бы предпочел не использовать систему обмена сообщениями.Если нет, то лучше ли использовать систему обмена сообщениями?Я также видел пример, когда какой-то парень просто использовал код позади представления, чтобы помочь передать свойство, однако я не хочу нарушать шаблон MVVM, так как я хочу провести некоторое тестирование на более позднем этапе.

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Лично я бы передавал ссылку на родительскую модель представления для каждой дочерней модели представления, чтобы иметь прямой доступ.

Я стараюсь избегать MVVM Light "Messenger" в максимально возможной степени.(это бесполезно при использовании контейнеров IoC, но это другая история)

2 голосов
/ 28 декабря 2011

Там определенно несколько способов справиться с вашим сценарием.Одно из них - использовать реализацию INotifyPropertyChanged для распространения вашего мероприятия.Проблема заключается в том, что для подписки на событие PropertyChanged контейнеру потребуется прямая ссылка на дочерний ViewModel.

class ParentVM {private const string SomePropertyName = "SomeProperty";

    public ParentVM()
    {
        ChildVM child = new ChildVM();
        child.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(child_PropertyChanged);
    }

    void child_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == SomePropertyName)
        {
            //Do something!!!
        }

    }
}

Вы также можете явно определить событие и подписаться на него.

...