带有 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
。因此,您的ContentControl
的DataContext
为null
。
要验证这一点,请为您的 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 中设置子内容,您需要指定 <Frame.Content>
,这与其他控件不同。
【讨论】:
以上是关于带有 DataTemplate 的 ContentControl 不显示任何内容(WPF MVVM)的主要内容,如果未能解决你的问题,请参考以下文章
使用 DataTemplate 时,ListView 仅显示列表中的最后一项
用于视图模型的具有多个 DataTemplate 的 ItemsControl
如何使用 DataTemplate 访问列表框中的特定项目?
如何使用类似表格的 DataTemplate 在 UWP ListView 中动态缩放列宽