从视图设置的视图模型的属性有只读依赖属性
问题描述:
我一直努力遵循a StackOverflow post以及官方documentation on MSDN实现在子类中的WPF画布的只读依赖属性控制由ViewModel使用。从视图设置的视图模型的属性有只读依赖属性
我定义我的子类帆布为:
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);
}
}
绑定到的属性中查看的XAML为:
<local:LayerCanvas CursorLocation="{Binding Path=CursorLocation, Mode=OneWayToSource}" ... />
实施中的视图模型属性为:
public Point CursorLocation
{
get { return this.cursorLocation; }
set
{
this.cursorLocation = value;
// ... logic ...
}
}
我在视图的XAML中收到错误"CursorLocation cannot be data-bound."
,并且编译时错误"The property 'LayerCanvas.CursorLocation' cannot be set because it does not have an accessible set accessor."
我认为Mode=OneWayToSource
会修复。我正在使用只读依赖项属性,而不是使用代码隐藏来尝试保留一个干净的MVVM实现。这是正确的方法吗?
答
从MSDN:
借助于不是硬性的,只读依赖属性 不适合多为哪些依赖 性质的情景通常提供一个解决方案(即:数据绑定,直接 可调整为一个值,验证,动画,继承)。
即使您将公开您的属性的setter,数据绑定也不起作用。所以答案是否定的,这不是正确的方法。即使绑定仅为OneWayToSource
,该属性也不能是只读的以支持数据绑定。
谢谢你的澄清。 – Noren 2013-02-18 15:47:16