WPF内容视图不显示DataTemplate

时间:2016-04-23 00:53:54

标签: c# wpf xaml mvvm

我有一个ContentControl,它不会从其DataTemplate中显示任何XAML,我确信我所遇到的问题对于WPF代码比我自己更好的人来说是显而易见的。我已经取代了#34; Object"因为保密原因,我的对象名称。

在我的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是一个从我的VM动态填充的ListView,我使用的是MVVM。一切正常。我希望只有在列表视图中有一个有效的选定对象时才会显示此ContentControl,但此时此操作系统的用户界面就是糖,因此我唯一关心的是让这个内容控件显示我的模型&#39;数据。

我也是StackOverflow的新手,所以如果我在发布此问题时遗漏了任何内容或发错,请告知我们。由于我不想浪费你的时间,所以我在过去几个小时内没有找到这个问题的运气。

1 个答案:

答案 0 :(得分:2)

两件事。您没有设置ContentControl的实际Content,而只设置其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>