2010-06-30 11 views
21

Quando tento di specificare più DataTemplates per l'utilizzo da parte di un ContentControl in modo che venga utilizzato quello corretto (basato su Tipo), si finisce con il Contenuto che è semplicemente il Contenuto ToString() valore.Come utilizzare automaticamente un DataTemplate in base al tipo di contenuto corrente di ContentControl

<ContentControl DataContext="{Binding MyTreeRootViewModels}" Content="{Binding /, Path=CurrentlySelectedTreeViewModel}"> 
    <ContentControl.Resources> 
    <DataTemplate DataType="x:Type vm:TypeAViewModel"> 
     <StackPanel> 
      <local:TypeAUserControl /> 
      </StackPanel> 
    </DataTemplate> 

    <DataTemplate DataType="x:Type vm:TypeBViewModel"> 
     <StackPanel> 
      <local:TypeBUserControl /> 
     </StackPanel> 
    </DataTemplate> 
    </ContentControl.Resources> 
</ContentControl> 

Nell'esempio sopra vedrei "MyApp.ViewModel.TypeAViewModel" visualizzato quando un nodo della struttura di TypeAViewModel restituisce CurrentlySelectedTreeViewModel. Mi aspetto di vedere il mio TypeAViewModelUserControl.

Ho provato a mettere un singolo < TextBlock Text = "TESTING"/> elemento in uno dei miei DataTemplates solo per vedere se il problema era correlato ai miei controlli utente. Stesso risultato

Qualche idea su cosa sto facendo male?

(A proposito, il CurrentSelectedTreeViewModel è una proprietà che restituisce il nodo attualmente selezionato nella mia struttura ad albero: sembra funzionare correttamente: mentre seleziono i nodi nell'albero, il nome del tipo corretto per il nodo appare ContentControl).

+0

Cercando di fare la stessa cosa; il mio problema era che non avevo il mio 'DataTemplates' nel' ContentControl.Resources'. Il tuo esempio è stata la mia soluzione! :) – mbmcavoy

risposta

25

Il bit x:Type dovrebbe essere tra parentesi graffe {}:

<DataTemplate DataType="{x:Type vm:TypeAViewModel}"> 
+13

Dooh. Grazie Bubblewrap. Emmanuel

5

x:Type è un MarkupExtension, che richiede {} per indicare al compilatore XAML.

Problemi correlati