我正在尝试创建一个可在 Canvas
中拖动的 UserControl
。我是 MVVM
的新手,也是 WPF
的新手(也是 StackOverflow 的新手)。
我有一个 View 模型,它为新的 UserControl
实现了 INotifyPropertyChanged
,它具有名为“Top”和“Left”的属性。我想将 View 模型的 Top 和 Left 属性绑定(bind)到 UserControl
的附加 Canvas.Left
和 Canvas.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);
// . . .
}
// . . .
}
为了测试,我手动创建了一些 View 模型实例,在它们上设置了 Left 和 Top 属性,通过将这些实例传递给构造函数创建了我的 UserControl
实例,并将它们添加到“Canvas” '.不幸的是,我添加的所有控件都显示在“Canvas”的左上角,调试器显示虽然正确设置了 View 模型的 Top 和 Left 属性,但调用 Canvas.GetLeft(... )
和控件上的 Canvas.GetTop(...)
返回 NaN
。
我做错了什么?我是不是采取了错误的方法?
我试图围绕这个 question & answer 编写我的代码.
编辑:
实际上,这确实有效!我的代码中有一个错误,其中 UserControl
没有获得对 View 模型实例的正确引用。一旦我正确连接它,它就可以正常工作。谢谢大家!
最佳答案
该代码应该可以正常工作。
控件实际上是 Canvas 的直接子级吗?否则它将无法工作。
关于c# - 如何在代码隐藏中绑定(bind)到 Canvas.Left 或 Canvas.Top 附加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9423296/