绑定不会更新

时间:2011-09-01 22:22:56

标签: wpf binding

我有从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时。左侧属性更新后文本框的位置仍未更新。

2 个答案:

答案 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);
}