2014-12-16 3 views
0

Я был довольно смущен относительно того, как работает следующий пример кода. Кажется, что Contentcontrol получает таблицу данных из ресурсов окна.WPF как установить datatemplates контента?

Не имеет ли contentcontrol свой собственный «contenttemplate», который должен определять, что в нем находится? Это просто поиск вверх и установка его содержимого на datatemplate, если на нем ничего не установлено?

Возможно, я смешиваю два термина, но я действительно смущен тем, почему в примере хранится дата-шаблон на уровне ресурсов окна.

Независимо от того, я пытаюсь понять, какие параметры у меня есть для установки вида для данного окна. Первоначально я собирался просто использовать contentcontrol и размещать представление внутри него, но потом я подумал, может быть, может быть причина, по которой контент-контроль выбирает страницу (из фактического класса страницы), а не вид (который расширяет пользователя контроль).

<Window.Resources> 
     <DataTemplate DataType="{x:Type local:HomeViewModel}"> 
      <local:HomeView /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:ProductsViewModel}"> 
      <local:ProductsView /> 
     </DataTemplate> 
    </Window.Resources> 


<DockPanel> 
    <Border DockPanel.Dock="Left" BorderBrush="Black" BorderThickness="0,0,1,0"> 
     <ItemsControl ItemsSource="{Binding PageViewModels}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Button Content="{Binding Name}" 
          Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
          CommandParameter="{Binding }" 
          Margin="2,5"/> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Border> 

    <ContentControl Content="{Binding CurrentPageViewModel}" /> 
</DockPanel> 

ответ

2

Он работает из-за DataType атрибутов. Если DataTemplate указывает DataType (без ключа), тогда среда выполнения будет сопоставлять объекты этого типа с шаблоном.

Не имеет ли contentcontrol своего собственного «contenttemplate», который должен определять, какой вид в нем?

Это действительно так, но если у него нет своего набора свойств ContentTemplate, тогда среда выполнения будет применять DataTemplate, соответствующий типу. Документация MSDN делает аналогию с TargetType элементом Style - вы можете применить стиль локально, но вы также можете применить стиль по всему миру к определенному типу. Например, использование <Style TargetType="{x:Type Button}"> применяет этот стиль ко всем кнопкам в области. Аналогично <DataTemplate DataType="{x:Type local:HomeViewModel}"> применяет этот шаблон ко всему контенту с типом «HomeViewModel».

Выполняется ли только поиск вверх и установка его содержимого на datatemplate, если на нем ничего не установлено?

Сортировка: да. Он ищет текущие ресурсы, которые включают ключи ресурсов, унаследованные от словарей родительских ресурсов.

Возможно, я смешиваю два термина, но я действительно смущен тем, почему в примере хранится дата-шаблон на уровне ресурсов окна.

Это не имеет значения - вы можете хранить их на уровне приложения или даже внутри ContentControl.

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