Ho un set di ViewModels che sto vincolando alla proprietà ItemsSource di un TabControl. Chiamiamo ViewModels AViewModel, BViewModel e CViewModel. Ognuno di questi deve avere un ItemTemplate diverso (per l'intestazione, perché ognuno deve mostrare un'icona diversa) e un ContentTemplate diverso (perché hanno modelli di interazione molto diversi).TabControl e DataTemplates WPF
Quello che mi piacerebbe è qualcosa di simile:
Definito in Resource.xaml file da qualche:
<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>
definito separatamente:
<TabControl ItemTemplate="[ Some way to select "ItemTemplate" based on the type ]"
ContentTemplate="[ Some way to select "ContentTemplate" based on the type ]"/>
Ora, io so che realisticamente, ogni volta che definisco un DataTemplate con la stessa chiave, il sistema si lamenterà. Ma, c'è qualcosa che posso fare che è simile a questo che mi permetterà di inserire un DataTemplate in un TabControl basato su un nome e un DataType?
+1 per l'approccio basato sul codice. Piuttosto facile da capire, piuttosto che usare i trigger. –
Mi sembra di ricordare che ci sia una chiave composita che è stata esclusa da Type e un identificatore ... forse nella versione .Net 3.0 di WPF. È ancora in giro da qualche parte? In questo modo, il mio DataTemplateSelector può essere piuttosto generico e non deve preoccuparsi di come trovare diversi ResourceDictionaries e tutto il resto. – dustyburwell
Ho trovato ComponentResourceKey e ho creato un ComponentResourceKeyDataTemplateSelector che trova un DataTemplate in base al tipo dell'elemento in fase di costruzione e a un ResourceId in cui passi. Considereresti una soluzione decente? – dustyburwell