¿Puedo especificar un tipo genérico en XAML (pre .NET 4 Framework)?

En XAML puedo declarar un DataTemplate para que la plantilla se use siempre que se muestre un tipo específico. Por ejemplo, este DataTemplate usará un TextBlock para mostrar el nombre de un cliente:

   

Me pregunto si es posible definir un DataTemplate que se usará cada vez que se muestre IList . Entonces, si el Contenido de ContentControl es, por ejemplo, un de ObservableCollection, usaría esa plantilla.

¿Es posible declarar un tipo genérico como IList en XAML usando la extensión de marcado {x: Type}?

No fuera de la caja, no; pero hay desarrolladores emprendedores que lo han hecho.

Mike Hillberg en Microsoft jugó con él en esta publicación , por ejemplo. Google tiene otros por supuesto.

No directamente en XAML, sin embargo, podría hacer referencia a un DataTemplateSelector de XAML para elegir la plantilla correcta.

 public class CustomerTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { DataTemplate template = null; if (item != null) { FrameworkElement element = container as FrameworkElement; if (element != null) { string templateName = item is ObservableCollection ? "MyCustomerTemplate" : "YourCustomerTemplate"; template = element.FindResource(templateName) as DataTemplate; } } return template; } } public class MyCustomer { public string CustomerName { get; set; } } public class YourCustomer { public string CustomerName { get; set; } } 

El diccionario de recursos:

                       

La ventana XAML:

         

El código de la ventana detrás:

 public partial class Window1 { public Window1() { InitializeComponent(); ObservableCollection myCustomers = new ObservableCollection() { new MyCustomer(){CustomerName="Paul"}, new MyCustomer(){CustomerName="John"}, new MyCustomer(){CustomerName="Mary"} }; ObservableCollection yourCustomers = new ObservableCollection() { new YourCustomer(){CustomerName="Peter"}, new YourCustomer(){CustomerName="Chris"}, new YourCustomer(){CustomerName="Jan"} }; //DataContext = myCustomers; DataContext = yourCustomers; } } 

También puede ajustar su clase genérica en una clase derivada que especifique el T

 public class StringList : List{} 

y usa StringList desde XAML.

aelij (el coordinador del proyecto WPF Contrib ) tiene otra forma de hacerlo.

Lo que es aún más genial (a pesar de que en algún momento estará apagado en el futuro) … es que XAML 2009 (XAML 2006 es la versión actual) lo apoyará de forma nativa. Consulte esta sesión de PDC 2008 para obtener más información y más.

Creo que en versiones reenviadas del framework .net esto se puede hacer.

Compruebe los generics en la documentación de XAML . Necesitarías usar x:TypeArguments ; hay algunas restricciones, así que lea primero la documentación.

Consulte también el Cómo especificar el argumento de tipo genérico en la pregunta XAML en Stackoverflow

Derrota por completo el propósito de un genérico, pero podría definir una clase que se derive del genérico como tal, con el único propósito de poder usar ese tipo en XAML.

 public class MyType : List { } 

Y usarlo en xaml por ejemplo, como