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 ...
    }
}

"CursorLocation cannot be data-bound."ビューの XAML でエラーが表示され、修正されると思われるコンパイル時エラーが表示"The property 'LayerCanvas.CursorLocation' cannot be set because it does not have an accessible set accessor."されます。Mode=OneWayToSourceコード ビハインドを使用する代わりに、読み取り専用の依存関係プロパティを使用して、クリーンな MVVM 実装を維持しようとしています。これは正しいアプローチですか?

4

1 に答える 1

4

MSDNから :

設定できないため、読み取り専用の依存関係プロパティは、依存関係プロパティが通常ソリューションを提供する多くのシナリオには適していません (つまり、データ バインディング、値に直接スタイル設定可能、検証、アニメーション、継承)。

プロパティのセッターを public にしても、データ バインディングは機能しません。したがって、答えは「いいえ」です。これは正しいアプローチではありません。バインディングが読み取り専用であっても、データ バインディングをサポートするためにプロパティを読み取り専用にすることはできませんOneWayToSource

于 2013-02-17T10:56:21.517 に答える