繁体   English   中英

如何在代码后面绑定到Canvas.Left或Canvas.Top附加属性?

[英]How do I bind to Canvas.Left or Canvas.Top attached property in code behind?

我正在尝试创建一个可在Canvas拖动的UserControl 我是MVVM新手,也是WPF新手(也是StackOverflow的新手)。

我有一个视图模型,它实现了INotifyPropertyChanged ,用于具有名为“Top”和“Left”的属性的新UserControl 我想将视图模型的Top和Left属性绑定到UserControl的附加Canvas.LeftCanvas.Top 由于我不会进入的原因,我不能使用任何XAML

这就是我实现我的Left(以及类似的Top)属性的方式(不确定如何使代码突出显示工作):

public class FooViewModel : INotifyPropertyChanged
{
    // . . .
    double _left;
    public double Left 
    { 
        get { return _left; }
        set
        {
            if(_left != value)
            {
                _left = value;
                NotifyPropertyChanged("Left");
            }
        }
    }
    // . . .
}

这就是我实现'UserControl'的方式:

public class FooControl : UserControl
{
    // . . .
    private FooViewModel _vm;

    public FooControl(FooViewModel vm)
    {
        _vm = vm;
        this.DataContext = _vm;

        Binding b = new Binding("Left");
        b.Mode = BindingMode.TwoWay;
        this.SetBinding(Canvas.LeftProperty, b);

        // . . .
    }
    // . . .
}

为了测试,我手动创建了一些视图模型实例,在它们上设置了Left和Top属性,通过将这些实例传递给构造函数创建了UserControl的实例,并将它们添加到'Canvas'中。 不幸的是,我添加的所有控件都显示在'Canvas'的左上角,调试器显示正确设置了视图模型的Top和Left属性,调用Canvas.GetLeft(...)Canvas.GetTop(...)上的Canvas.GetTop(...)返回NaN

我究竟做错了什么? 我采取了错误的做法吗?

我试图围绕这个问题和答案建立我的代码。

编辑:实际上,这确实有效! 我的代码中有错误, UserControl没有获得对视图模型实例的正确引用。 一旦我正确地连接它,它工作正常。 感谢大家!

该代码应该可以正常工作。

控件实际上是画布的直接子画面吗? 如果不是它将无法正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM