c# - 如何在代码隐藏中绑定(bind)到 Canvas.Left 或 Canvas.Top 附加属性?

标签 c# wpf mvvm

我正在尝试创建一个可在 Canvas 中拖动的 UserControl。我是 MVVM 的新手,也是 WPF 的新手(也是 StackOverflow 的新手)。

我有一个 View 模型,它为新的 UserControl 实现了 INotifyPropertyChanged,它具有名为“Top”和“Left”的属性。我想将 View 模型的 Top 和 Left 属性绑定(bind)到 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");
            }
        }
    }
    // . . .
}

这就是我实现“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/

相关文章:

c# - Xamarin:如何从Android设备打印到点阵打印机?

C#4 : Real-World Example of Dynamic Types

c# - 如何修复 'microsoft.maintainability' 构建错误?

c# - 使用属性或扩展 json.net 库寻找 Hydra/Json-ld 序列化程序

wpf - 'System.Windows.Data.Binding' 类型的对象无法转换为 'System.String' 类型

c# - 事件处理程序中抛出的 WPF 异常被吞噬了吗?

c# - 从代码中为 WPF 中的 MatrixTransform 设置动画

c# - 连接 2 个变量的 Getter Only 属性上的 DataBinding

c# - Xamarin.Forms - ContextMenu 上的绑定(bind)

c# - WPF MVVM 应用程序中常量(标签文本等)应该放在何处