Wpf 装订不';我不能得到更新
我有一个从TextBox派生的类,我将一个名为position的point类型的依赖属性附加到该类,并在其set部分设置Canvas.Top和Canvas.Left属性。只是澄清一下,每当源属性更改时,它都会调用属性的set部分,对吗?因为当我的源代码更新文本框的canvastop和canvasleft属性时,不会得到更新。 任何帮助都将不胜感激Wpf 装订不';我不能得到更新,wpf,binding,Wpf,Binding,我有一个从TextBox派生的类,我将一个名为position的point类型的依赖属性附加到该类,并在其set部分设置Canvas.Top和Canvas.Left属性。只是澄清一下,每当源属性更改时,它都会调用属性的set部分,对吗?因为当我的源代码更新文本框的canvastop和canvasleft属性时,不会得到更新。 任何帮助都将不胜感激 public static readonly DependencyProperty PositionProperty = DependencyProp
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);
}
}
其中CreateConnectorBinding基于Canvas.Top和Canvas.Left属性返回椭圆的中点。但当椭圆的画布。顶部和画布。左侧属性得到更新文本框的位置仍然没有更新 只是澄清一下,每当源属性更改时,它都会调用属性的set部分,对吗 不可以。只有在从代码调用属性时才会发生这种情况。绑定系统完全绕过setter
如果需要这样做,正确的方法是在DP的元数据中使用registered。当PositionProperty值通过绑定更改时,它不使用setter。您需要在DependencyProperty注册中将PropertyChangeCallback添加到FrameworkPropertyMetadata:
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 changed之前得到更新,这样我就可以使用d.X而不是value.X。或者使用e.NewValue、control.Position.X,或者从静态方法调用该属性所在的任何类中的方法,并从那里进行设置
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);
}