【问题标题】:How do I bind to Canvas.Left or Canvas.Top attached property in code behind?如何在后面的代码中绑定到 Canvas.Left 或 Canvas.Top 附加属性?
【发布时间】:2012-02-23 23:46:58
【问题描述】:

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

我有一个视图模型,它实现了INotifyPropertyChanged,用于新的UserControl,它具有名为“Top”和“Left”的属性。我想将我的视图模型的 Top 和 Left 属性绑定到 UserControl 的附加 Canvas.LeftCanvas.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 而不是画布属性。
  • 您能否提供将控件添加到画布的代码。我刚刚使用您的代码制作了一个快速示例,它工作正常,所以我相信它在其他地方是一个问题,在您上面没有提供的代码中。
  • 我明天回到我的机器时会尝试发布更完整的代码。

标签: c# wpf mvvm


【解决方案1】:

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

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

【讨论】:

  • 你是对的,它确实有效!今天早上用新的眼光看着调试器,我注意到用户控件没有正确连接到视图模型,因为它的构造函数中的错字(哎呀!)。谢谢大家的帮助——您确认代码应该可以工作让我保持在正轨上,而不是试图解决一个不存在的问题。
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 2010-10-07
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2011-08-26
相关资源
最近更新 更多