2010-06-30 3 views
21

Когда я пытаюсь указать несколько DataTemplates для использования ContentControl, чтобы использовать правильный (на основе типа), я в конечном итоге получаю контент, Значение ToString().Как автоматически использовать DataTemplate на основе DataType ContentControl CurrentType

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

В приведенном выше примере я бы увидеть «MyApp.ViewModel.TypeAViewModel» отображается, когда дерево узел TypeAViewModel возвращается CurrentlySelectedTreeViewModel. Я ожидаю увидеть мой TypeAViewModelUserControl.

Я попытался положить один текстовый элемент TextBlock Text = "TESTING"/> в один из моих DataTemplates, чтобы увидеть, была ли проблема связана с моими пользовательскими элементами управления. Тот же результат.

Любые идеи, что я делаю неправильно?

(Кстати, CurrentSelectedTreeViewModel является свойством, которое возвращает выбранный в данный момент узел в моем древовидном представлении. Кажется, что все работает отлично - поскольку я выбираю узлы в дереве, правильное имя типа для узла появляется ContentControl).

+0

Попытка сделать то же самое; моя проблема в том, что у меня не было своих «DataTemplates» в «ContentControl.Resources». Ваш пример был моим решением! :) – mbmcavoy

ответ

25

x:Type бит должен быть между фигурными скобками {}:

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

Dooh. Спасибо Bubblewrap. Emmanuel

5

x:Type является MarkupExtension, который требует {} чтобы указать XAML компилятор.

Смежные вопросы