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)); 
     } 
    } 
} 
+0

感谢,但我想,以使新属性只读... – meanandvicious 2010-07-26 09:28:34

+0

也许这MSDN文章将帮助: http://msdn.microsoft.com/en -us /库/ ms754044.aspx – 2010-07-26 13:37:02