附属物业变更事件?

Mic*_*nne 7 c# wpf attached-properties

如果附加属性发生变化,有没有办法获得变更通知?

一个简单的例子是一个CanvasRectangle在它.Rectange使用DepenendyProperties Canvas.Top和设置的位置Canvas.Left.我正在使用一个Adorner通过改变Canvas.Top和来移动矩形Canvas.Left.

<Canvas Width="500" Height="500" >
   <Rectangle Width="40" Height="40" Canvas.Left="10" Canvas.Top="20" />
</Canvas>
Run Code Online (Sandbox Code Playgroud)

下一步是在两者之间创建一个箭头Rectangles.为了跟踪移动Rectangles,每当一个位置发生变化时,箭头必须得到一个变化通知Rectangle.如果我可以在附加属性Canvas.Top更改时获得更改通知,这将很容易.

谢谢你的帮助,迈克尔

Tho*_*que 17

你为什么不用绑定?这正是他们为......设计的......

如果由于某种原因,您无法使用绑定,则可以添加一个处理程序,以便在属性值更改时收到通知:

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)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 您应该避免使用DependencyPropertyDescriptor进行更改通知,因为如果不清除它们会导致内存泄漏.请阅读[here](http://agsmith.wordpress.com/2008/04/07/propertydescriptor-addvaluechanged-alternative/)了解详情.但是,我试图找出为什么它不适用于附加属性(因为这个问题涉及到).但是这个提示应该至少为遇到类似情况的其他人提供一些信息. (2认同)