Tengo un conjunto de ViewModels que estoy vinculando a la propiedad ItemsSource de un TabControl. Llamemos a esos ViewModels AViewModel, BViewModel y CViewModel. Cada uno de ellos debe tener una ItemTemplate diferente (para el encabezado, porque cada uno debe mostrar un icono diferente) y una ContentTemplate diferente (porque tienen modelos de interacción muy diferentes).WPF TabControl y DataTemplates
Lo que me gustaría es algo como esto:
Definido en Resource.xaml archivos en otro lugar:
<DataTemplate x:Key="ItemTemplate" DataType="{x:Type AViewModel}">
...
</DataTemplate>
<DataTemplate x:Key="ItemTemplate" DataType="{x:Type BViewModel}">
...
</DataTemplate>
<DataTemplate x:Key="ItemTemplate" DataType="{x:Type CViewModel}">
...
</DataTemplate>
<DataTemplate x:Key="ContentTemplate" DataType="{x:Type AViewModel}">
...
</DataTemplate>
<DataTemplate x:Key="ContentTemplate" DataType="{x:Type BViewModel}">
...
</DataTemplate>
<DataTemplate x:Key="ContentTemplate" DataType="{x:Type CViewModel}">
...
</DataTemplate>
definen por separado:
<TabControl ItemTemplate="[ Some way to select "ItemTemplate" based on the type ]"
ContentTemplate="[ Some way to select "ContentTemplate" based on the type ]"/>
Ahora, sé que de forma realista, cada vez que defino un DataTemplate con la misma clave, el sistema se va a quejar. Pero, ¿hay algo que pueda hacer que sea similar a esto que me permita poner un DataTemplate en un TabControl basado en un nombre y un DataType?
+1 para el enfoque basado en código. Bastante fácil de entender, en lugar de usar disparadores. –
Me parece recordar que hay una clave compuesta que se desconectó de Tipo y un identificador ... tal vez en la versión .Net 3.0 de WPF. ¿Todavía está por aquí? De esta forma, mi DataTemplateSelector puede ser bastante genérico y no tener que preocuparse por cómo encontrar diferentes ResourceDictionaries y todo eso. – dustyburwell
Encontré el ComponentResourceKey y creé un ComponentResourceKeyDataTemplateSelector que encuentra un DataTemplate basado en el tipo de elemento que se está modelando y un ResourceId que se transfiere. ¿Consideraría esto una solución decente? – dustyburwell