MVVM WPF从视图内部导航视图

时间:2018-07-10 13:02:33

标签: c# wpf xaml mvvm

我已经被这个问题困扰了几个小时。我遵循了似乎最相关(无框架)WPF MVVM navigate views的答案,但我遗漏了一些东西,但这是行不通的。它只会在屏幕上显示.toString方法,而不是实际的数据模板。

我拥有的是MainWindow.xamlView1.xamlView2.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是在代码后面设置的。

1 个答案:

答案 0 :(得分:2)

要使示例工作从数据模板中删除x:Key="..."


ContentControl绑定到CurrentView。 CurrentView是一个视图模型实例,没有可视表示(不是从框架Visual类派生的。)

没有ContentTemplate,因此ContentControl尝试为View1Model(或View2Model)类型查找默认的DataTemplate。但是在资源中声明的两个DataTemplate都不是默认值,它们都以x:Key命名。所以ContentControl什么也没找到,而是退回有保证的方法:显示Content的字符串表示形式,因为每个.NET对象都有ToString()方法。