¿Hay alguna forma de usar la herencia de plantillas de datos en WPF?

¿Es posible tener la composición o herencia de DataTemplate (similar a “BasedOn” en Estilos)? Hay 2 instancias donde lo necesito.

  1. Para clases heredadas: tengo una clase base con varias clases heredadas. No quiero duplicar la plantilla de la clase base en cada uno de los DataTemplate la clase derivada.

  2. Diferentes vistas: para la misma clase, quiero definir una plantilla de datos y luego agregarla a esa plantilla, según corresponda. Ex. la plantilla base mostrará los datos en el objeto y luego quiero diferentes plantillas que puedan realizar diferentes acciones en el objeto, mientras se muestran los datos (heredando la plantilla base).

Lo único que he encontrado para este tipo de cosas es esto:

             

Básicamente, esto crea una plantilla “común” a la que se puede hacer referencia utilizando una clave (BaseClass en este caso). Luego definimos el DataTemplate real para la clase base y cualquier clase derivada. La plantilla de clase derivada luego agregaría sus propias “cosas”.

Hubo una discusión sobre esto en msdn hace un tiempo, pero a nadie se le ocurrió una solución mejor que yo vi.

@Fragilerus y @Liz, en realidad creo que se me ocurrió algo mejor. Aquí hay otro enfoque que no solo evita el enlace adicional de ContentPresenter, sino que también elimina la necesidad de tener que aplicar una plantilla dentro de una plantilla, ya que el contenido compartido es contenido directo que se configura en tiempo de comstackción. Lo único que sucede en el tiempo de ejecución serían los enlaces que establece dentro del contenido directo. Como tal, esto acelera enormemente la UI en comparación con la otra solución.

             

Importante: asegúrese de usar el atributo x:Shared en su contenido compartido o esto no funcionará.

El camino WPF’y

Dicho esto, esta no es la forma más fácil de WPF de hacer lo que está buscando. Eso se puede lograr usando la clase DataTemplateSelector que hace exactamente eso … selecciona una plantilla de datos basada en cualquier criterio que establezcas.

Por ejemplo, puede configurar fácilmente uno que busque sus tipos de datos conocidos y devuelva el mismo DataTemplate para ambos, pero para todos los demás, vuelve al sistema para resolver el DataTemplate. Eso es lo que realmente hacemos aquí.

¡Espero que esto ayude! 🙂