Как автоматически использовать DataTemplate на основе DataType текущего содержимого ContentControl - PullRequest
25 голосов
/ 30 июня 2010

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

<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 возвращается с помощью CurrentSelectedTreeViewModel.Я ожидаю увидеть мой TypeAViewModelUserControl.

Я пытался поставить одинэлемент в одном из моих шаблонов данных, просто чтобы увидеть, была ли проблема связана с моими пользовательскими элементами управления.Тот же результат.

Есть идеи, что я делаю неправильно?

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

Ответы [ 2 ]

30 голосов
/ 30 июня 2010

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

<DataTemplate DataType="{x:Type vm:TypeAViewModel}">
6 голосов
/ 30 июня 2010

x:Type - это MarkupExtension , для которого требуется {} для указания компилятору XAML.

...