2012-04-05 19 views
6

Tengo una jerarquía de clases de la siguiente manera y el enlace a la propiedad VisibleRange está arrojando al diseñador.El enlace solo se puede establecer en DependencyProperty de DependencyObject - cuando la propiedad se reemplaza por

Dada la jerarquía de clases aquí:

// Base class 
public abstract class AxisBase : ContentControl, IAxis 
{ 
    public static readonly DependencyProperty VisibleRangeProperty = DependencyProperty.Register(
     "VisibleRange", typeof(IRange), typeof(AxisBase), 
     new PropertyMetadata(default(IRange), OnVisibleRangeChanged)); 

    public IRange VisibleRange 
    { 
     get { return (IRange)GetValue(VisibleRangeProperty); } 
     set { SetValue(VisibleRangeProperty, value); } 
    } 
} 

// Derived class 
public class DateTimeAxis : AxisBase 
{ 
     public new IRange<DateTime> VisibleRange 
     { 
      get { return (IRange<DateTime>)GetValue(VisibleRangeProperty); } 
      set { SetValue(VisibleRangeProperty, value); } 
     } 
} 

// And interface definitions 
public interface IRange<T> : IRange 
{ 
} 

y de diseño (XAML) aquí:

<local:DateTimeAxis Style="{StaticResource XAxisStyle}"            
     VisibleRange="{Binding ElementName=priceChart, 
         Path=XAxis.VisibleRange, Mode=TwoWay}"/> 

me sale esta excepción:

A 'Encuadernación' no se puede establecer en la propiedad 'VisibleRange' de tipo 'DateTimeAxis'. Un 'Enlace' solo se puede establecer en una DependencyProperty de un DependencyObject.

La clase derivada DateTimeAxis está exponiendo la propiedad VisibleRange que es anulado por la palabra clave new. No puedo agregar un typeparam genérico a la clase base AxisBase, y también necesito acceder a la propiedad en ambas clases. Entonces, me pregunto teniendo en cuenta estas limitaciones, si alguien tiene alguna sugerencia sobre cómo hacerlo mejor para evitar las excepciones del diseñador.

+0

Andrew Burnett-Thom: trataste de codificar como en mi respuesta. Funcionó ? – Tigran

Respuesta

10

La 'propiedad de dependencia' es lo que se registró:

public static readonly DependencyProperty VisibleRangeProperty = 
    DependencyProperty.Register("VisibleRange", typeof(IRange), typeof(AxisBase), ...); 

Y cuando nos fijamos en que la declaración se puede ver que se está registrando en typeof(IRange)

La clase derivada DateTimeAxis es exponer la propiedad VisibleRange que es anulada por la nueva palabra clave.

Sí, pero está exponiendo una propiedad 'normal', no una propiedad de dependencia.
Otro factor es que las propiedades tienen diferentes tipos.

+0

Está exponiendo DependencyProperty de la base, supongo que aquí es donde está yendo mal ¿no? Es posible que la nueva anulación y simplemente poner yesos a través del código –

+2

Sí, los DP son bestias extrañas. Yo eludiría esto. –

+0

Hecho, y funciona :) ¡Gracias por el consejo! –

0

Pruebe a escribir en su inicialización código de su XAxis, como

AxisBase XAxis = new DateTimeAxis()

En caso de trabajo.

+0

Tengo curiosidad si lo hace ... –

+0

@HenkHolterman: en realidad yo también, escribiré en OP .. :) – Tigran

+0

No estoy seguro de lo que quiere decir con esto - DateTimeAxis está construido en Xaml, no C# código –

Cuestiones relacionadas