带有 DataTemplate 的 ContentControl 不显示任何内容(WPF MVVM)
ContentControl with DataTemplate is not displaying anything (WPF MVVM)
在我的 MainView 中,有一个包含 ContentControl 的框架,该框架应该根据 MainViewModel 中设置的 ViewModel 显示视图。
但是,我的 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
{}
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;
}
如需进一步阅读,您可以阅读以下内容post:
page.DataContext not inherited from parent Frame?
此外,作为旁注,Frame
预期用途是将 Source
属性 设置为外部文件。您可能已经注意到,与其他控件不同,为了在 xaml 中设置子内容,您需要指定 <Frame.Content>
。
在我的 MainView 中,有一个包含 ContentControl 的框架,该框架应该根据 MainViewModel 中设置的 ViewModel 显示视图。
但是,我的 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
{}
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;
}
如需进一步阅读,您可以阅读以下内容post: page.DataContext not inherited from parent Frame?
此外,作为旁注,Frame
预期用途是将 Source
属性 设置为外部文件。您可能已经注意到,与其他控件不同,为了在 xaml 中设置子内容,您需要指定 <Frame.Content>
。