私は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 実装を維持しようとしています。これは正しいアプローチですか?