【问题标题】:WPF Content View not displaying DataTemplateWPF 内容视图不显示 DataTemplate
【发布时间】: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 中)边框/背景渐变显示,但仅此而已。正在运行的程序也是如此。

如果我将&lt;!-- Valid XAML --&gt; 移动到控制模板中,它会显示得很好,但我不认为这是犹太教,我也不相信数据绑定会以这种方式工作。如果我错了,请纠正我。

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) 使用&lt;ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}"/&gt;,或2) 不要设置@ 987654326@ 在所有;相反,从您的模板中删除 x:Key 并让 WPF 中的自动模板查找行为为您找到模板。 (我也不会使用DynamicResource,除非你有很好的理由这样做......我在这里看不到任何看起来像的东西)

标签: c# wpf xaml mvvm


【解决方案1】:

两件事。您没有设置 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>

【讨论】:

  • 感谢您的意见。虽然这些技巧都没有解决我的问题(请参阅上面的评论)修复目标类型允许我使用 {Template Binding ..} 而不是直接指定资源,这很重要。此外,使用 Content 代替 DataContext 也是一项重要的改进。我不知道如何感谢所有参与协助我的各方。
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
相关资源
最近更新 更多