2010-03-17 6 views
7

Есть ли способ получить уведомление об изменении, если изменилось связанное свойство?Прикрепленное свойство Измененное событие?

Простым примером является Canvas с Rectangle. Положение Rectange устанавливается с помощью DepenendyProperties Canvas.Top и Canvas.Left. Я использую Adorner для перемещения Rectangle вокруг, меняя Canvas.Top и Canvas.Left.

<Canvas Width="500" Height="500" > 
    <Rectangle Width="40" Height="40" Canvas.Left="10" Canvas.Top="20" /> 
</Canvas> 

Следующим шагом является создание Стрелу между двумя Rectangles. Чтобы отслеживать движение Rectangles, стрелка должна получать уведомление об изменении при изменении позиции Rectangle. Это было бы легко, если бы я мог просто получить измененное уведомление, когда изменится Attached Property Canvas.Top.

Спасибо за любую помощь, Майкл

+2

http://stackoverflow.com/questions/2192612/how-do-i-handle-canvas-top-change-event-in-wpf – Jake

+0

Спасибо за эту ссылку. Полностью пропустил этот. –

ответ

16

Почему бы вам не использовать привязку? Это именно то, что они предназначены для ...

Если по какой-то причине, вы не можете использовать привязку, вы можете добавить обработчик, чтобы получать уведомления, когда значение свойства изменяется:

var topDescriptor = DependencyPropertyDescriptor.FromProperty(Canvas.TopProperty, typeof(Rectangle)); 
var leftDescriptor = DependencyPropertyDescriptor.FromProperty(Canvas.LeftProperty, typeof(Rectangle)); 
topDescriptor.AddValueChanged(rectangle, rectangle_PositionChanged); 
leftDescriptor.AddValueChanged(rectangle, rectangle_PositionChanged); 

... 

private void rectangle_PositionChanged(object sender, EventArgs e) 
{ 
    ... 
} 
+0

Это помогло мне с отладкой. Благодаря! – xr280xr

+2

Вам следует избегать использования DependencyPropertyDescriptor для уведомления об изменении, поскольку они приводят к утечке памяти, если не очищены. Подробнее читайте здесь [здесь] (http://agsmith.wordpress.com/2008/04/07/propertydescriptor-addvaluechanged-alternative/). Тем не менее, я пытаюсь выяснить, почему он не работает для меня при добавленных свойствах (как этот вопрос относится). Но этот совет должен хотя бы предоставить некоторую информацию другим, которые сталкиваются с подобными ситуациями. – bigfoot