Puis-je spécifier un type générique dans XAML (avant .NET 4 Framework)?

En XAML, je peux déclarer un DataTemplate afin que le modèle soit utilisé chaque fois qu’un type spécifique est affiché. Par exemple, ce DataTemplate utilisera un TextBlock pour afficher le nom d’un client:

   

Je me demande s’il est possible de définir un DataTemplate qui sera utilisé chaque fois qu’un IList est affiché. Ainsi, si le contenu d’un ContentControl est, par exemple, un object ObservableCollection , il utiliserait ce modèle.

Est-il possible de déclarer un type générique comme IList dans XAML en utilisant l’extension {x: Type}?

Non sorti de la boîte, non; mais il y a des développeurs entreprenants qui l’ont fait.

Mike Hillberg chez Microsoft a joué avec dans cet article , par exemple. Google en a bien sûr d’autres.

Pas directement dans XAML, cependant vous pouvez référencer un DataTemplateSelector de XAML pour choisir le bon modèle.

 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) { ssortingng templateName = item is ObservableCollection ? "MyCustomerTemplate" : "YourCustomerTemplate"; template = element.FindResource(templateName) as DataTemplate; } } return template; } } public class MyCustomer { public ssortingng CustomerName { get; set; } } public class YourCustomer { public ssortingng CustomerName { get; set; } } 

Le dictionnaire de ressources:

                       

La fenêtre XAML:

         

Le code de la fenêtre derrière:

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

Vous pouvez également envelopper votre classe générique dans une classe dérivée qui spécifie le T

 public class SsortingngList : List{} 

et utilisez SsortingngList de XAML.

aelij (le coordinateur du projet WPF Consortingb ) a un autre moyen de le faire.

Ce qui est encore plus cool (même s’il est parfois éteint dans le futur) … est que XAML 2009 (XAML 2006 est la version actuelle) va le supporter de manière native. Découvrez cette session PDC 2008 pour plus d’informations.

Je crois que cela peut être fait dans les versions renvoyées du framework .net.

Vérifiez les génériques dans la documentation XAML . Vous devez utiliser x:TypeArguments ; il y a quelques ressortingctions alors lisez d’abord la documentaion.

Voir aussi l’ argument Comment spécifier le type générique dans la question XAML sur Stackoverflow

Cela va à l’encontre du but d’un générique, mais vous pouvez définir une classe dérivée du générique comme ça, dans le seul but de pouvoir utiliser ce type dans XAML.

 public class MyType : List { } 

Et l’utiliser dans xaml par exemple comme