¿Cómo anular las propiedades de una dependencia en una clase genérica?

Entonces tengo una clase; usemos el ScrollViewer clase como ejemplo. Tiene una propiedad de dependencia llamada Content que acepta cualquier cosa de tipo System.Object, ¡estupendo!

Digamos que obtengo una clase de ScrollViewer, llamémoslo ZoomScrollViewer, agrega algunas funciones básicas de zoom y panorámica usando el mouse con una pulsación de teclado. También agrega una propiedad de dependencia propia, AutoscaleContent.

Ahora, quiero poder poner un ZoomScrollViewer en una ventana de IU, pero yo , de manera quiere que acepte un lienzo como contenido. Naturalmente, me dedico a crear un ZoomScrollViewer<T> clase.

Sin embargo, ¿cómo puedo cambiar la propiedad Content para que solo acepte elementos de tipo? <T>? ¿Puedo anular la propiedad de dependencia? Me confundí un poco e intenté:

    public new T Content
    {
        get { return (T)base.Content; }
        set { base.Content = value; }
    }

Pero, por supuesto, esto hace que ya no sea una propiedad de dependencia, por lo que todo el código XAML falla cuando configuro los enlaces.

Editar: También debe tenerse en cuenta que he echado un vistazo al uso de:

ZoomScrollViewer.ContentProperty.OverrideMetadata(typeof(ZoomScrollControl2<T>), new PropertyMetadata(...?));

Para ver si puedo hacer algo con eso, pero parece que solo puede anular el valor predeterminado, a menos que me falte algo.

Actualización: ahora he intentado usar lo siguiente:

public class ZoomScrollControl2<T> : ZoomScrollViewer where T : FrameworkElement
{
    static ZoomScrollControl2()
    {
        ContentProperty.OverrideMetadata(typeof(ZoomScrollControl2<T>), new FrameworkPropertyMetadata(typeof(ZoomScrollControl2<T>)));
    }
}

public class CanvasZoomControl : ZoomScrollControl2<Canvas>
{
}

Lo que pensé que funcionaría, pero todavía parece aceptar un Contenido de cualquier tipo.

Actualización: En resumen, no estoy seguro de si lo que quiero hacer es posible, así que he marcado la discusión como la respuesta, aunque no es una respuesta en sí.

preguntado el 02 de febrero de 12 a las 11:02

por lo que el ZoomScrollViewer.ContentProperty.OverrideMetadata( typeof(ZoomScrollControl2), new FrameworkPropertyMetadata(typeof(ZoomScrollControl2)) no funciona para ti? -

La línea de código que he introducido no hace nada, sin embargo, lo que ha puesto es diferente. ¿Sugieres eso como respuesta? -

Sugiero probar ese enfoque como lo sugirió este Artículo de MSDN. Eso debemos anular el referencia type, por lo que puede hacer referencia a él utilizando el tipo derivado. Dependencia La visibilidad de la propiedad no está implícita en .NET Framework para los tipos derivados, ya que la búsqueda de la propiedad correcta entre el árbol de tipos tiene un costo en términos de rendimiento, y considerando que usamos DP en el enlace de la interfaz de usuario, puede generar problemas de rendimiento no deseables. -

1 Respuestas

Sugiero probar ese enfoque como lo sugirió este Artículo de MSDN.

It debemos anule el tipo de referencia, por lo que puede hacer referencia a él utilizando el tipo derivado.

Dependency Property la visibilidad no se hace explícita en .NET Framework para tipos derivados, ya que buscar la propiedad correcta entre el árbol de tipos tiene un costo en términos de rendimiento, y considerando que usamos DP en el enlace de la interfaz de usuario, puede provocar problemas de rendimiento no deseables.

Respondido 02 Feb 12, 16:02

Cerca, pero no puro. Eche un vistazo a la actualización que publiqué arriba, ¿estoy haciendo algo mal? - Siyfion

@Siyfion: ¿por qué no usas CanvasZoomControl, considerando que es el último en la jerarquía de dependencias? - Tigran

Estoy en el * .xaml, tengo: <CanvasZoomControl Grid.Row="2" ViewContent="{Binding Path= Cutlines}" /> por lo cual Cutlines es una propiedad de Canvas, pero si la cambio en este momento, continúa independientemente. - Siyfion

El problema entonces es que cada implementación de la clase genérica debe crearse manualmente en código ... ¡Quizás lo que estoy preguntando no es posible / no es una buena idea! Solo lo veo como una forma de tener un control que funcione con cualquier cosa, pero que se puede restringir a permitir el uso de una sola clase si es necesario. De esa manera, siempre sabrá que si tiene contenido, puede confiar en que sea de tipo T. - Siyfion

@Siyfion: si desea que DependencyProperty declarada en la clase base sea simplemente accesible en una derivada en XAML, como cualquier otra ordinaria, desafortunadamente no es posible, por las razones descritas anteriormente. Pero la buena noticia es que debemos poder decir explícitamente: quiero poder acceder a mi propiedad de clase base desde XAML desde el este type, anulando los metadatos. - Tigran

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.