如何绑定到Canvas.Left或Canvas.在代码隐藏中顶部附加的属性

本文关键字:Canvas 隐藏 代码 顶部 属性 何绑定 绑定 Left | 更新日期: 2023-09-27 18:25:42

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

我有一个视图模型,它实现了新UserControlINotifyPropertyChanged,它具有名为"Top"answers"Left"的属性。我想将视图模型的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");
            }
        }
    }
    // . . .
}

这就是我实现"用户控制"的方式:

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(...)会返回NaN

我做错了什么?我是不是走错了路?

我试着把我的代码建立在这个问题的基础上;答复

编辑:事实上,这确实有效!我在代码中犯了一个错误,UserControl没有得到对视图模型实例的正确引用。一旦我把它正确地连接起来,效果就很好。谢谢大家!

如何绑定到Canvas.Left或Canvas.在代码隐藏中顶部附加的属性

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

控件实际上是画布的直接子控件吗?如果不这样做,它将不起作用。