带有 DataTemplate 的 ContentControl 不显示任何内容(WPF MVVM)

Posted

技术标签:

【中文标题】带有 DataTemplate 的 ContentControl 不显示任何内容(WPF MVVM)【英文标题】:ContentControl with DataTemplate is not displaying anything (WPF MVVM) 【发布时间】:2021-12-15 10:00:46 【问题描述】:

在我的 MainView 中,有一个 Frame 包含一个 ContentControl,它应该根据 MainViewModel 中设置的 ViewModel 显示一个 View。 但是,我的 MainView 上没有显示任何内容。知道为什么吗?

主视图

<Grid>
    <Frame HorizontalAlignment="Center">
        <Frame.Content>
            <ContentControl Content="Binding TestViewContext">
                <ContentControl.Resources>
                    <DataTemplate DataType="x:Type local:TestViewModel">
                        <local:TestView />
                    </DataTemplate>
                </ContentControl.Resources>
            </ContentControl>
        </Frame.Content>
    </Frame>
</Grid>

MainViewModel

public class MainViewModel : BaseViewModel

    private TestViewModel _testViewContext;
    public TestViewModel TestViewContext
    
        get  return _testViewContext; 
        set  _testViewContext = value; OnPropertyChanged(nameof(TestViewContext)); 
    

    public MainViewModel()
    
        TestViewContext = new TestViewModel();
    

测试视图 只是一个红色的页面

TestViewModel

public class TestViewModel : ViewModelBase

【问题讨论】:

【参考方案1】:

Frame 有点特别。通常,子控件继承父控件的DataContext。但是,对于Frame,子代不会继承DataContext。因此,您的ContentControlDataContextnull

要验证这一点,请为您的 ContentControl 命名,如下所示:

<ContentControl x:Name="MyContentControl" Content="Binding TestViewContext">

然后在MainView的构造函数中,检查DataContext如下:

public MainView()

    // Other code

    // Set a breakpoint here and view the DataContext
    var dataContext = MyContentControl.DataContext;

如需进一步阅读,您可以阅读以下帖子: page.DataContext not inherited from parent Frame?

另外,作为旁注,Frame 的预期用途是将Source 属性设置为外部文件。您可能已经注意到,为了在 xaml 中设置子内容,您需要指定 &lt;Frame.Content&gt;,这与其他控件不同。

【讨论】:

以上是关于带有 DataTemplate 的 ContentControl 不显示任何内容(WPF MVVM)的主要内容,如果未能解决你的问题,请参考以下文章

使用 DataTemplate 时,ListView 仅显示列表中的最后一项

用于视图模型的具有多个 DataTemplate 的 ItemsControl

如何使用 DataTemplate 访问列表框中的特定项目?

如何使用类似表格的 DataTemplate 在 UWP ListView 中动态缩放列宽

如何在复选框事件上访问嵌套listview datatemplate中的标签名称

为什么我在DataTemplate中的Cascading Dropdown不起作用?