我有从TextBox派生的类,我附加了一个名为position的类型的依赖属性,在它的set部分中我设置了Canvas.Top和Canvas.Left属性。只是为了澄清一下,每当源属性发生变化时,它都会调用属性的set部分吗?因为当我的源更新时,文本框的canvastop和canvasleft属性不会更新。 任何帮助,将不胜感激。
public static readonly DependencyProperty PositionProperty = DependencyProperty.Register("Position", typeof(Point), typeof(TextBox), new FrameworkPropertyMetadata(new Point(0, 0)));
public Point Position
{
get { return (Point)GetValue(PositionProperty); }
set
{
SetValue(PositionProperty, value);
Canvas.SetLeft(this, value.X - this.Width / 2);
Canvas.SetTop(this, value.Y - this.FontSize);
}
}
this.TextBoxShape.SetBinding(TextBoxShape.PositionProperty, CreateConnectorBinding(this));
其中CreateConnectorBinding基于Canvas.Top和Canvas.Left属性返回椭圆的中点。但是当Ellipse的Canvas.Top和Canvas时。左侧属性更新后文本框的位置仍未更新。
答案 0 :(得分:2)
只是澄清一下,每当source属性发生变化时,它都会调用属性的set部分吗?
没有。只有从代码调用属性时才会发生这种情况。绑定系统完全绕过了setter。
如果您需要这样做,正确的方法是使用DP的元数据中注册的Property Changed Callbacks。
答案 1 :(得分:1)
当PositionProperty值通过绑定更改时,不使用setter。您需要在DependencyProperty注册上的FrameworkPropertyMetadata中添加PropertyChangeCallback:
public static readonly DependencyProperty PositionProperty =
DependencyProperty.Register("Position", typeof(Point), typeof(TextBox),
new FrameworkPropertyMetadata(new Point(0, 0), PositionChanged));
private static void PositionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
YourControl control = (YourControl)d;
Canvas.SetLeft(d, d.Position.X - d.Width / 2);
Canvas.SetTop(d, d.Position.Y - d.FontSize);
}