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

时间:2012-02-23 23:46:59

标签: c# wpf mvvm

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

我有一个视图模型,它实现了INotifyPropertyChanged,用于具有名为“Top”和“Left”的属性的新UserControl。我想将视图模型的Top和Left属性绑定到Canvas.Left的附加Canvas.TopUserControl。由于我不会进入的原因,我不能使用任何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(...)和{{1}在控件上返回Canvas.GetTop(...)

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

我尝试将代码基于此question & answer

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

1 个答案:

答案 0 :(得分:3)

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

控件实际上是立即画布的子画面吗?如果没有,它将无法工作。