WPF: Как сделать свойство зависимостей базового класса доступным только для чтения_

У меня есть класс 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);
                }
        )));
    }
}

Я серьезно надеюсь, что есть лучший способ сделать это... Есть предложения?

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 ) );
        }
    }
}
Другие вопросы по тегам