【问题标题】:WPF: How to make a base class' dependency property read-only_WPF:如何使基类的依赖属性只读_
【发布时间】:2011-03-20 03:03:16
【问题描述】:

我有课 public class NavigableViewport3D : Viewport3D。该类应隐藏Viewport3D.Camera 属性,使其变为只读。这是我目前所拥有的:


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

我真的希望有更好的方法来完成这个...有什么建议吗?

【问题讨论】:

    标签: c# wpf inheritance dependency-properties member-hiding


    【解决方案1】:

    这个怎么样:

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

    【讨论】:

    猜你喜欢
    • 2010-12-17
    • 2021-03-10
    • 2010-11-10
    • 1970-01-01
    • 2014-05-23
    • 2011-07-22
    • 1970-01-01
    相关资源
    最近更新 更多