2010-06-30 6 views
21

Cuando intento especificar varias DataTemplates para que la use ContentControl para que se use la correcta (basada en el tipo), termino con contenido que es simplemente el contenido ToString() valor.Cómo utilizar automáticamente un DataTemplate basado en el DataType del contenido actual de 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> 

En el ejemplo anterior me gustaría ver "MyApp.ViewModel.TypeAViewModel" aparece cuando un nodo de árbol de TypeAViewModel es devuelto por CurrentlySelectedTreeViewModel. Espero ver mi TypeAViewModelUserControl.

He intentado poner un solo elemento < TextBlock Text = "TESTING"/> en uno de mis DataTemplates solo para ver si el problema estaba relacionado con mis controles de usuario. Mismo resultado.

¿Alguna idea de lo que estoy haciendo mal?

(Por cierto, el CurrentlySelectedTreeViewModel es una propiedad que devuelve el nodo seleccionado actualmente en mi vista de árbol. Parece que funciona bien, como selecciono nodos en el árbol, aparece el nombre de tipo correcto para el nodo ContentControl).

+0

Intentando hacer lo mismo; mi problema era que no tenía mi 'DataTemplates' en' ContentControl.Resources'. ¡Tu ejemplo fue mi solución! :) – mbmcavoy

Respuesta

25

El bit x:Type debe estar entre corchetes {}:

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

Dooh. Gracias Bubblewrap. Emmanuel

5

x:Type es un MarkupExtension, que requiere {} para indicar al compilador XAML.

Cuestiones relacionadas