我有一个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的新手,所以如果我在发布此问题时遗漏了任何内容或发错,请告知我们。由于我不想浪费你的时间,所以我在过去几个小时内没有找到这个问题的运气。
答案 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>