我正在尝试在UserControl
中创建一个可拖动的Canvas
。我是MVVM
的新手,对WPF
来说相对较新(对StackOverflow来说也是新手)。
我有一个视图模型,它实现了INotifyPropertyChanged
,用于具有名为“Top”和“Left”的属性的新UserControl
。我想将视图模型的Top和Left属性绑定到Canvas.Left
的附加Canvas.Top
和UserControl
。由于我不会进入的原因,我不能使用任何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
没有得到对视图模型实例的正确引用。一旦我正确地连接它,它工作正常。谢谢大家!
答案 0 :(得分:3)
该代码应该可以正常工作。
控件实际上是立即画布的子画面吗?如果没有,它将无法工作。