我已经被这个问题困扰了几个小时。我遵循了似乎最相关(无框架)WPF MVVM navigate views的答案,但我遗漏了一些东西,但这是行不通的。它只会在屏幕上显示.toString方法,而不是实际的数据模板。
我拥有的是MainWindow.xaml
,View1.xaml
和View2.xaml
以及相关的ViewModel。两个视图都有可以转到另一个视图的按钮。为什么ContentControl仅显示.toString()?
MainWindow.xaml
<Window.Resources>
<DataTemplate x:Key="View1Template" DataType="{x:Type viewmodels:View1Model}">
<views:View1 />
</DataTemplate>
<DataTemplate x:Key="View2Template" DataType="{x:Type viewmodels:View2Model}">
<views:View2 />
</DataTemplate>
</Window.Resources>
<Grid>
<ContentControl Content="{Binding CurrentView}" />
</Grid>
MainWindowViewModel.cs
public class MainWindowViewModel : ViewModelBase
{
private ViewModelBase currentView;
public ViewModelBase CurrentView
{
get
{
return currentView;
}
set
{
if (currentView != value)
{
currentView = value;
OnPropertyChanged("CurrentView");
}
}
}
public MainWindowViewModel ()
{
CurrentView = new View1Model();
}
}
我应该如何进行这项工作?此外,用于交换视图的命令应该在哪里?在这个MainWindowViewModel.cs
中?
DataContext是在代码后面设置的。
答案 0 :(得分:2)
要使示例工作从数据模板中删除x:Key="..."
。
ContentControl绑定到CurrentView。 CurrentView是一个视图模型实例,没有可视表示(不是从框架Visual
类派生的。)
没有ContentTemplate
,因此ContentControl尝试为View1Model
(或View2Model
)类型查找默认的DataTemplate。但是在资源中声明的两个DataTemplate都不是默认值,它们都以x:Key
命名。所以ContentControl什么也没找到,而是退回有保证的方法:显示Content的字符串表示形式,因为每个.NET对象都有ToString()
方法。