WPF: как сделать свойство зависимостей базового класса доступным только для чтения_ - PullRequest
1 голос
/ 23 июля 2010

у меня есть класс 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 ... Если бы не было свойств зависимости, я бы сделал это так: <pre> public class NavigableViewport3D : Viewport3D { public new Camera Camera { get { return base.Camera; } protected set { base.Camera = value; } }<br> } Вот уродливый способ, который должен выполнить двусторонний обмен:


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 Ответ

0 голосов
/ 24 июля 2010

Как насчет этого:

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