C# WPF内容视图未显示数据模板

C# WPF内容视图未显示数据模板,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有一个ContentControl,它不会显示其DataTemplate中的任何XAML,我确信我所面临的问题对于那些具有比我更好的WPF代码的人来说是显而易见的。出于保密原因,我已在适当情况下将“对象”替换为我的对象名称 在my Main Window.xaml中,我有以下内容: <ContentControl x:Name="ObjectDetailView" Margin="20,20,20,20" Grid.Row="2" Grid.Column=

我有一个ContentControl,它不会显示其DataTemplate中的任何XAML,我确信我所面临的问题对于那些具有比我更好的WPF代码的人来说是显而易见的。出于保密原因,我已在适当情况下将“对象”替换为我的对象名称

在my Main Window.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中)显示边框/背景渐变,但没有进一步显示。正在运行的程序也是如此

如果我将
移动到控件模板中,它会显示得很好,但我认为这不是洁食,我也不认为数据绑定会以这种方式工作。如果我错了,请纠正我

ObjectListView是从我的VM动态填充的ListView,我正在使用MVVM。这一切都很好。我希望这个ContentControl只在列表视图中有一个有效的选定对象时才显示,但这只是此时的问题,因此我唯一关心的是让这个ContentControl显示我的模型的数据


我也是StackOverflow的新手,所以如果我在发布这个问题时遗漏了什么或者犯了错误,请让我知道。在过去的几个小时里,我没有幸搜索到这个问题,因为我不想浪费你的时间。

两件事。您没有设置ContentControl的实际内容,只设置了它的DataContext。你应该写以下内容:

<ContentControl ...
    Content="{Binding SelectedItem, ElementName=ObjectListView}"
    Template="{DynamicResource DetailControlTemplate}" 
    ContentTemplate="{DynamicResource DetailDataTemplate}"/>
如果没有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>

两件事。您没有设置ContentControl的实际内容,只设置了它的DataContext。你应该写以下内容:

<ContentControl ...
    Content="{Binding SelectedItem, ElementName=ObjectListView}"
    Template="{DynamicResource DetailControlTemplate}" 
    ContentTemplate="{DynamicResource DetailDataTemplate}"/>
如果没有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>


如果在资源字典中将DataTemplate移动到ContentTemplate之前会发生什么?没有明显的效果。并且ListView中的SelectedItem肯定是model:Object?它不是空的吗?顺便说一句,你可以用一个样式来隐藏内容控件,该样式有一个触发器,如果content={x:Null},则该触发器将可见性设置为Collapsed或Hidden,但正如你所说的,可以等待。我相信SelectedItem在程序首次启动时为Null。有些东西,比如线条和标签,是静态的,我希望在没有模型支持的情况下,它们会存在。如果没有对象,它会不能显示这些吗?一旦我点击我的一个ListView项目,我知道它设置了调试中的SelectedItem。感谢关于可见性的提示,不知道为什么我从来没有想到过,因为我在脑海中的某个角落(毫无疑问是蛛网密布的)意识到了这一点。如果没有可靠地再现问题的好东西,就不可能确切地知道问题是什么。这就是说,我认为至少有两件事值得改变,看看它是否能解决您的问题:1)使用
,或2)根本不设置
内容模板
;相反,从模板中删除
x:Key
,让WPF中的自动模板查找行为为您找到模板。(我也不会使用
DynamicResource
,除非你有很好的理由这样做……我在这里看不到任何类似的东西)如果你在资源字典中将DataTemplate移动到ContentTemplate之前会发生什么?没有明显的效果。ListView中的SelectedItem肯定是model:Object?它不是空的吗?顺便说一句,你可以用一个样式来隐藏内容控件,该样式有一个触发器,如果content={x:Null},则该触发器将可见性设置为Collapsed或Hidden,但正如你所说的,可以等待。我相信SelectedItem在程序首次启动时为Null。有些东西,比如线条和标签,是静态的,我希望在没有模型支持的情况下,它们会存在。如果没有对象,它会不能显示这些吗?一旦我点击我的一个ListView项目,我知道它设置了调试中的SelectedItem。感谢关于可见性的提示,不知道为什么我从来没有想到过,因为我在脑海中的某个角落(毫无疑问是蛛网密布的)意识到了这一点。如果没有可靠地再现问题的好东西,就不可能确切地知道问题是什么。这就是说,我认为至少有两件事值得改变,看看它是否能解决您的问题:1)使用
,或2)根本不设置
内容模板
;相反,从模板中删除
x:Key
,让WPF中的自动模板查找行为为您找到模板。(我也不会使用
DynamicResource
,除非您有很好的理由这样做……我在这里没有看到任何类似的内容)谢谢您的输入。虽然这些技巧都没有解决我的问题(请参见上面的注释),但修复目标类型允许我使用
{Template Binding..}
而不是直接指定资源,这一点很重要。此外,使用内容而不是DataContext也是一项重要的改进。我有点不知所措,不知该如何信任所有帮助我的人。谢谢你的意见。虽然这些技巧都没有解决我的问题(请参见上面的注释),但修复目标类型允许我使用
{Template Binding..}
而不是直接指定资源,这一点很重要。此外,使用内容而不是DataContext也是一项重要的改进。我有点不知所措,不知该如何信任所有帮助我的人。