【问题标题】:Binding doesn't get updated绑定没有更新
【发布时间】:2011-09-01 22:22:56
【问题描述】:

我有一个派生自 TextBox 的类,我将一个名为 position 的点类型的依赖属性附加到该类,并在其设置部分中设置 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。左侧属性得到更新,文本框的位置仍未更新。

【问题讨论】:

    标签: wpf binding


    【解决方案1】:

    澄清一下,每当源属性更改时,它调用属性的 set 部分是否正确?

    没有。这只发生在您从代码调用属性时。绑定系统完全绕过了 setter。

    如果你需要这样做,正确的方法是使用在DP的元数据中注册的Property Changed Callbacks

    【讨论】:

      【解决方案2】:

      当 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);
      }
      

      【讨论】:

      • 如何获取该值,因为该方法无法访问它?在调用 Position 更改之前属性是否得到更新,所以我可以使用 d.X 而不是 value.X。
      • 要么使用 e.NewValue、control.Position.X,要么从静态方法中调用具有此属性的任何类中的方法并从那里进行设置
      猜你喜欢
      • 2011-07-25
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 2020-04-21
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多