WPF:如何使基类的依赖项属性为只读
问题描述:
我有一个类 public class NavigableViewport3D : Viewport3D
。该类应该隐藏Viewport3D.Camera
属性,以使其变为只读。这是我到目前为止有:WPF:如何使基类的依赖项属性为只读
public class NavigableViewport3D : Viewport3D
{
protected static readonly DependencyPropertyKey CameraPropertyKey = DependencyProperty.RegisterReadOnly(
"Camera",
typeof(Camera),
typeof(NavigableViewport3D),
new PropertyMetadata()
);
public static readonly new DependencyProperty CameraProperty = CameraPropertyKey.DependencyProperty;
public new Camera Camera
{
get
{
return base.Camera;
}
protected set
{
base.Camera = value;
}
}
}
但我也希望NavigableViewport3D.CameraProperty
到送花儿给人返回相同的值作为Viewport3D.CameraProperty
/base.Camera
... 如果没有依赖属性,我会做这样的:
public class NavigableViewport3D : Viewport3D
{
public new Camera Camera
{
get
{
return base.Camera;
}
protected set
{
base.Camera = value;
}
}
}
这里是要做到双向交流的丑陋的方式:
public class NavigableViewport3D : Viewport3D
{
protected static readonly DependencyPropertyKey CameraPropertyKey = DependencyProperty.RegisterReadOnly(
"Camera",
typeof(Camera),
typeof(NavigableViewport3D),
new PropertyMetadata(new PropertyChangedCallback(
delegate(DependencyObject depO, DependencyPropertyChangedEventArgs e)
{
if (e.OldValue != e.NewValue) //Not sure whether this is needed
depO.SetValue(Viewport3D.CameraProperty, e.NewValue);
}
)));
public static readonly new DependencyProperty CameraProperty = CameraPropertyKey.DependencyProperty;
public new Camera Camera
{
get
{
return this.Camera;
}
protected set
{
this.Camera = value;
}
}
public NavigableViewport3D()
{
Viewport3D.CameraProperty.AddOwner(
typeof(NavigableViewport3D),
new PropertyMetadata(new PropertyChangedCallback(
delegate(DependencyObject depO, DependencyPropertyChangedEventArgs e)
{
var nv3d = depO as NavigableViewport3D;
if (nv3d == null)
return;
nv3d.SetValue(CameraPropertyKey, e.NewValue);
}
)));
}
}
我认真地希望有更好的方式来做到这一点...有什么建议?
答
如何:
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
}
public class NavigableViewport3D : Viewport3D
{
public static readonly new DependencyProperty CameraProperty;
static NavigableViewport3D()
{
NavigableViewport3D.CameraProperty = Viewport3D.CameraProperty.AddOwner(typeof(NavigableViewport3D));
}
}
}
感谢,但我想,以使新属性只读... – meanandvicious 2010-07-26 09:28:34
也许这MSDN文章将帮助: http://msdn.microsoft.com/en -us /库/ ms754044.aspx – 2010-07-26 13:37:02