Замок динамического прокси и INotifyPropertyChanged на WPF - PullRequest
3 голосов
/ 24 августа 2010

Я обертываю свои сущности с помощью прокси-сервера, используя Castle DP, мои сущности сами реализуют INotifyPropertyChanged.и вызвать событие, когда вызывается set.

Я написал какой-то модульный тест для обёртывания, чтобы увидеть, что событие изменилось, когда я манипулирую сущностями через прокси, и все они прошли.проблема в реальном приложении с экраном, когда я связываю экран со свойством, которое на самом деле является DP, экран, регистрирующийся в свойстве, изменяется по-другому, и он просто не работает, если я не реализую управление регистрацией внутри перехватчикаcode

почему это поведение, что wpf делает с тем свойством, которое я не делаю при регистрации на измененное свойство?

Ответы [ 3 ]

1 голос
/ 11 сентября 2012

В замке АОП следует помнить одну важную вещь - метод Equals работает не так, как вы ожидаете.

Смотрите здесь: RRSL-Lite.EntityAOP . У меня была та же идея - создать AOP для INPC и создать эту библиотеку. Здесь - простой пример того, как его использовать.

0 голосов
/ 18 апреля 2017

Вероятно, это связано с тем, что вы оборачиваете свои сущности методом Касла CreateInterfaceProxyWithTarget или аналогичным. Если вы полагаетесь на свои сущности для реализации INPC и ретранслируете свои перехватчики событий PropertyChanged на базовую цель прокси, помните, что когда событие PropertyChanged возбуждено, sender будет вашим сущность не ваш прокси . Если вы пытаетесь связать свой прокси в WPF, он будет ожидать, что sender будет прокси . Если нет, он проигнорирует изменение. Решение состоит в том, чтобы перехватить события и убедиться, что вы установили sender в качестве прокси .

0 голосов
/ 12 января 2011

Прокси-класс, сгенерированный как Интерфейсный Прокси, будет иметь явные реализации интерфейса свойств, и привязка WPF не будет работать, если она явно не совпадает.

Два решения - изменить пути привязки, чтобы явно включить интерфейс:

{Binding Path=(local:IEntity.ID)} instead of just {Binding ID}

или использовать прокси-сервер виртуального метода для моделей / сущностей представления и создавать любые методы, которые вы перехватываете виртуальными.

...