【发布时间】:2012-02-23 23:46:58
【问题描述】:
我正在尝试创建一个可在Canvas 中拖动的UserControl。我对MVVM 是全新的,对WPF 相对较新(对 StackOverflow 也很陌生)。
我有一个视图模型,它实现了INotifyPropertyChanged,用于新的UserControl,它具有名为“Top”和“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 实例,并将它们添加到“画布”中。不幸的是,我添加的所有控件都显示在“画布”的左上角,并且调试器显示,虽然视图模型的 Top 和 Left 属性设置正确,但在控件上调用 Canvas.GetLeft(...) 和 Canvas.GetTop(...)返回NaN。
我做错了什么?我是否采取了错误的方法?
我已尝试将我的代码基于此 question & answer。
编辑:
实际上,这确实有效!我的代码中有错误,UserControl 没有正确引用视图模型的实例。一旦我正确连接它,它就可以正常工作。谢谢大家!
【问题讨论】:
-
我试图将我的解决方案基于this question 的答案,我认为这基本上实现了我在
XAML中想要的。他们在那里提到TwoWay模式允许数据源(我的视图模型)在用户在画布中移动控件时更新(最终我打算让这些控件可拖动)。 -
@Pysul:这取决于该拖动的实现,在这种情况下也只会编辑 VM 而不是画布属性。
-
您能否提供将控件添加到画布的代码。我刚刚使用您的代码制作了一个快速示例,它工作正常,所以我相信它在其他地方是一个问题,在您上面没有提供的代码中。
-
我明天回到我的机器时会尝试发布更完整的代码。