Уведомление об изменении свойства при изменении членов свойства
Скажем, у меня есть свойство с именем 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 твой друг.