Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 装订不';我不能得到更新_Wpf_Binding - Fatal编程技术网

Wpf 装订不';我不能得到更新

Wpf 装订不';我不能得到更新,wpf,binding,Wpf,Binding,我有一个从TextBox派生的类,我将一个名为position的point类型的依赖属性附加到该类,并在其set部分设置Canvas.Top和Canvas.Left属性。只是澄清一下,每当源属性更改时,它都会调用属性的set部分,对吗?因为当我的源代码更新文本框的canvastop和canvasleft属性时,不会得到更新。 任何帮助都将不胜感激 public static readonly DependencyProperty PositionProperty = DependencyProp

我有一个从TextBox派生的类,我将一个名为position的point类型的依赖属性附加到该类,并在其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);
        }
    }

其中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);
}