【发布时间】:2016-04-23 00:53:53
【问题描述】:
我有一个 ContentControl,它不会显示来自其 DataTemplate 的任何 XAML,而且我确信我面临的问题对于那些 WPF 编码比我自己更好的人来说是显而易见的。出于保密原因,我已将“对象”替换为我的对象名称。
在我的 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}"/>
我将模板保存在单独的文件中以保持代码可读性。该模板位于已成功用于 ListView 的 DataResources.xaml 文件中。相关内容/模板的代码是:
<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 只在列表视图中有一个有效的选定对象时出现,但此时这是 UX 糖,因此我唯一关心的是让这个内容控件显示我的模型数据。
我也是 StackOverflow 的新手,所以如果我在发布此问题时遗漏了任何内容或出错,请告诉我。在过去的几个小时里我没有找到这个问题,因为我不想浪费你的时间。
【问题讨论】:
-
如果将 DataTemplate 移到资源字典中 ContentTemplate 之前会发生什么?
-
无明显效果。
-
而ListView中的SelectedItem肯定是model:Object?它不为空吗?顺便说一句,如果 Content={x:Null} ,您可以使用具有将可见性设置为 Collapsed 或 Hidden 的触发器的样式隐藏内容控件,但正如您所说,可以等待。
-
我相信 SelectedItem 在程序第一次启动时为空。有些东西像线条和标签是静态的,我希望在没有模型支持的情况下存在。如果没有对象,它会无法显示这些吗?单击我的 ListView 项目之一后,我知道它会从我的调试中设置 SelectedItem。感谢您提供有关可见性的提示,不知道为什么我从未想过这一点,因为我在脑海中的某个(无疑是蜘蛛网)角落里意识到了这一点。
-
没有可靠地重现问题的良好minimal reproducible example,因此无法确定问题所在。也就是说,我认为至少有两件事值得更改,看看它是否能解决您的问题:1) 使用
<ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}"/>,或2) 不要设置@ 987654326@ 在所有;相反,从您的模板中删除x:Key并让 WPF 中的自动模板查找行为为您找到模板。 (我也不会使用DynamicResource,除非你有很好的理由这样做......我在这里看不到任何看起来像的东西)