如何绑定到Canvas.Left或Canvas.在代码隐藏中顶部附加的属性
本文关键字:Canvas 隐藏 代码 顶部 属性 何绑定 绑定 Left | 更新日期: 2023-09-27 18:25:42
我正在尝试创建一个可在Canvas
中拖动的UserControl
。我是MVVM
的新手,也是WPF
的新手(也是StackOverflow的新手)。
我有一个视图模型,它实现了新UserControl
的INotifyPropertyChanged
,它具有名为"Top"answers"Left"的属性。我想将视图模型的Top和Left属性绑定到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");
}
}
}
// . . .
}
这就是我实现"用户控制"的方式:
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
没有得到对视图模型实例的正确引用。一旦我把它正确地连接起来,效果就很好。谢谢大家!
该代码应该可以正常工作。
控件实际上是画布的直接子控件吗?如果不这样做,它将不起作用。