2016-04-23 5 views
0

У меня есть ContentControl, который не будет отображать XAML из своего DataTemplate, и я уверен, что проблема, с которой я столкнулась, будет очевидна для тех, у кого лучше WPF-код, чем я. Я заменил «Объект» для моего имени объекта, если это необходимо для конфиденциальности.WPF Content View не отображается DataTemplate

В моей MainWindow.xaml я это:

<ContentControl x:Name="ObjectDetailView" 
       Margin="20,20,20,20" Grid.Row="2" Grid.Column="1" 
       DataContext="{Binding SelectedItem, ElementName=ObjectListView}" 
       Template="{DynamicResource DetailControlTemplate}" 
       ContentTemplate="{DynamicResource DetailDataTemplate}"/> 

Я держу свои шаблоны в отдельных файлах, чтобы сохранить код читаемым. Шаблон находится в файле DataResources.xaml, который успешно используется для ListView. Код для содержания/шаблона в вопросе:

<ControlTemplate x:Key="DetailControlTemplate"> 
    <Border Style="{StaticResource ObjectDetailBorderStyle}"> 
     <ContentPresenter/> 
    </Border> 
</ControlTemplate> 

<DataTemplate x:Key="DetailDataTemplate" DataType="{x:Type model:Object}"> 
    <!-- Valid XAML --> 
</DataTemplate> 

В моем дизайнере (как в VS и Blend,) Граница/фон градиентных дисплеях, но ничего больше. То же самое для текущей программы.

Если я перемещаю <!-- Valid XAML --> в Шаблон управления, он отображается нормально, но я не считаю, что это кошерный, и я также не считаю, что привязка данных будет работать именно так. Пожалуйста, поправьте меня, если я ошибаюсь.

ObjectListView - это ListView, динамически заполняемый с моей виртуальной машины, и я использую MVVM. Все работает отлично. Я бы предпочел, чтобы этот ContentControl появился только после того, как в представлении списка есть допустимый выделенный объект, но это UX-сахар в данный момент, поэтому моя единственная проблема заключается в том, чтобы этот элемент управления содержимым отображал данные моей модели.

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

+0

Что произойдет, если вы переместите DataTemplate до ContentTemplate в словарь ресурсов? –

+0

Отсутствие заметного эффекта. – Rhynri

+0

И SelectedItem в ListView определенно является моделью: Object? И это не так? Кстати, вы могли бы скрыть элемент управления содержимым со стилем на нем, который имеет триггер, который устанавливает видимость в Collapsed или Hidden, если Content = {x: Null}, но, как вы говорите, может подождать. –

ответ

2

Две вещи. Вы не установили фактический Content ContentControl, но только его DataContext. Вместо этого вы должны написать следующее:

<ContentControl ... 
    Content="{Binding SelectedItem, ElementName=ObjectListView}" 
    Template="{DynamicResource DetailControlTemplate}" 
    ContentTemplate="{DynamicResource DetailDataTemplate}"/> 

И ваш ControlTemplate не хватает TargetType:

<ControlTemplate x:Key="DetailControlTemplate" TargetType="ContentControl"> 
    <Border Style="{StaticResource ObjectDetailBorderStyle}"> 
     <ContentPresenter/> 
    </Border> 
</ControlTemplate> 

Без TargetType некоторые свойства ContentPresenter в не установлены по умолчанию, и вы должны установить их явно подобный

<ControlTemplate x:Key="DetailControlTemplate"> 
    <Border Style="{StaticResource ObjectDetailBorderStyle}"> 
     <ContentPresenter 
      Content="{Binding Content, 
         RelativeSource={RelativeSource TemplatedParent}}" 
      ContentTemplate="{Binding ContentTemplate, 
           RelativeSource={RelativeSource TemplatedParent}}"/> 
    </Border> 
</ControlTemplate> 
+0

Благодарим вас за ввод. Хотя ни один из этих трюков не исправил мою проблему (см. Мой комментарий выше). Фиксирование целевого типа позволяет мне использовать '{Template Binding ..}' вместо прямого указания ресурса, что важно. Кроме того, использование Content вместо DataContext также является важным улучшением. Я немного не понимаю, как кредитовать всех вовлеченных сторон, помогая мне. – Rhynri

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