Уведомление об изменении свойства при изменении членов свойства

Скажем, у меня есть свойство с именем Location типа Point в моей ViewModel, к которой привязывается мой View. Я использую MVVM Light's ObservableObject а также RaisePropertyChanged Настройка для получения уведомлений об изменении свойств. Проблема в том, что когда я выполняю следующее во ViewModel:

this.Location = new Point(100,100);

мой вид обновляется правильно. Но если я сделаю:

this.Location.Offset(10,10);

мой вид не обновляется, означает Location свойство не уведомляет View об изменении. Почему это так? Как сделать под-свойства встроенных типов, таких как Point или же Size иметь дело с уведомлением об изменении?

3 ответа

Решение

Основная проблема заключается в том, что Point изменчиво

Вы можете написать свой собственный ImmutablePoint это позволяет преобразование в существующий класс Point и обратно для совместимости API, но не допускает такие методы, как Offset,

Это не идеальное решение, но оно решает проблему изменения полей свойства, а не самого свойства.

В земле MVVM ваша ViewModel отвечает за уведомление View при изменении свойств. Большинство классов.NET не реализуют INotifyPropertyChanged сами по себе, так что вы не получите автоматическое подключение при их использовании. Вам придется поднять PropertyChanged себя на Location свойство каждый раз, когда вы изменяете какие-либо свойства Location

В качестве альтернативы, вы можете реализовать свой собственный Point объект, который реализует INotifyPropertyChanged,

Вы можете добавить INotifyPropertyChanged к своим членам класса автоматически с помощью Castle Dynamic Proxy (который оборачивает ваши модели в прокси во время выполнения) или PropertyChanged.Fody (который изменяет IL модели во время компиляции). Google твой друг.

Другие вопросы по тегам