2

我一直在尝试关注StackOverflow 帖子以及MSDN 上的官方文档,以在 ViewModel 使用的 WPF Canvas 控件的子类上实现只读依赖属性。

我已将 Canvas 的子类定义为:

public class LayerCanvas : Canvas
{
    private static readonly DependencyPropertyKey ReadOnlyCursorLocationPropertyKey =
        DependencyProperty.RegisterReadOnly("CursorLocation", typeof(Point), typeof(LayerCanvas),
        new PropertyMetadata(new Point(0, 0)));

    public static readonly DependencyProperty CursorLocationProperty =
        ReadOnlyCursorLocationPropertyKey.DependencyProperty;

    public LayerCanvas()
        : base()
    {

    }

    public Point CursorLocation
    {
        get { return (Point)GetValue(CursorLocationProperty); }
        private set { SetValue(ReadOnlyCursorLocationPropertyKey, value); }
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
        this.CursorLocation = e.GetPosition(this);
    }
}

绑定到 View 的 XAML 中的属性为:

<local:LayerCanvas CursorLocation="{Binding Path=CursorLocation, Mode=OneWayToSource}" ... />

将 ViewModel 中的属性实现为:

public Point CursorLocation
{
    get { return this.cursorLocation; }
    set
    {
        this.cursorLocation = value;
        // ... logic ...
    }
}

我收到View 的 XAML 中的错误和我认为可以修复"CursorLocation cannot be data-bound."的编译时错误。我正在使用只读依赖属性而不是使用代码隐藏来尝试保持干净的 MVVM 实现。这是正确的方法吗?"The property 'LayerCanvas.CursorLocation' cannot be set because it does not have an accessible set accessor."Mode=OneWayToSource

4

1 回答 1

4

来自 MSDN

由于不可设置,只读依赖属性不适用于依赖属性通常提供解决方案的许多场景(即:数据绑定、可直接设置为值、验证、动画、继承)。

即使您将属性的设置器公开,数据绑定也不起作用。所以答案是否定的,这不是正确的方法。为了支持数据绑定,该属性不能是只读的,即使绑定是OneWayToSource唯一的。

于 2013-02-17T10:56:21.517 回答