How to Automatically Use a DataTemplate Based on ContentControl's Current Content's DataType
Asked Answered
P

2

29

When I attempt to specify multiple DataTemplates for use by a ContentControl so that the correct one (based on Type) is used, I end up with Content that is simply the Content's ToString() value.

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

In the example above I would see MyApp.ViewModel.TypeAViewModel displayed when a tree node of TypeAViewModel is returned by CurrentlySelectedTreeViewModel. I expect to see my TypeAViewModelUserControl.

I've tried putting a single <TextBlock Text="TESTING"/> element in one of my data templates just to see if the problem was related to my user controls. Same result.

Any ideas what I am doing wrong?

(By the way, the CurrentlySelectedTreeViewModel is a property that returns the currently selected node in my TreeView. It seems to work just fine - as I select nodes in the tree, the correct type name for the node appears ContentControl).

Passable answered 30/6, 2010 at 12:14 Comment(1)
Trying to do the same thing; my problem was I didn't have my DataTemplates in the ContentControl.Resources. Your example was my solution! :)Thermometer
N
35

The x:Type bit should be between curly braces {}:

<DataTemplate DataType="{x:Type vm:TypeAViewModel}">
Nisbet answered 30/6, 2010 at 12:28 Comment(1)
Dooh. Thanks Bubblewrap.<MyFace BackgroundColor="Red" />Passable
F
7

x:Type is a MarkupExtension, which requires {} to indicate to the XAML compiler.

Fishtail answered 30/6, 2010 at 12:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.