如何在没有“祖父母”DataContext的情况下更改MVVM中的整个视图?

时间:2015-03-02 04:49:57

标签: c# wpf mvvm view navigation

我在互联网上看到的所有示例都有两个区域 - 一个区域用于更改视图的按钮,另一个区域用于应该由该按钮更改的视图。因此,它会一直有效,直到您尝试访问位于“grand-parent”数据上下文中的命令。但是,我想将整个视图更改为另一个视图而不划分区域或任何边栏并将数据从View1发送到View2,然后更新View1。

我正在尝试更改MVVM应用程序中的Views。例如,我有“ApplicationView”(包含Views1(UserControl1)和View2(UserControl2)的DataTemplates的主机)。这些用户控件具有自己的datacontext。 ApplicationView的xaml是:

<Window ……..>    
<Window.Resources>
    <DataTemplate DataType="{x:Type localViewModel:VMMain}">
        <localView:MainView/>            
    </DataTemplate>
    <DataTemplate DataType="{x:Type localViewModel:VMEditStudent}">
        <localView:EditStudentView/>
    </DataTemplate>
</Window.Resources>    
<Grid>
    <ContentControl Content="{Binding CurrentPageViewModel}"/>
</Grid>

enter image description here

View 1(UserControl1)拥有自己的DataContext: enter image description here

View 2(UserControl2)也有自己的DataContext:

enter image description here

我想要的是在DataGrid中选择一个项目(Adam),单击“编辑”按钮,然后View1应该被视图2替换为来自数据网格的填充数据。据我所知,我应该通过处理按钮“编辑”的命令来更改View1,然后应该显示View 2,然后我更改数据,然后View1应该更新。怎么做?

一些代码示例将非常感谢!感谢。

1 个答案:

答案 0 :(得分:1)

您的示例与您提到的典型示例类似,只是您的视图按钮位于其中一个视图中。解决方案只是将Button.Command属性数据绑定到父视图模型中的命令。这可以通过简单的RelativeSource Binding

来完成

UserControl1 XAML中:

<Button Content="Edit" Command="{Binding DataContext.EditCommand, 
    RelativeSource={RelativeSource AncestorType={x:Type YourPrefix:YourParentView}}}" />

在父视图模型编辑命令中,您需要这样的内容:

CurrentPageViewModel = new ViewModelForUserControl2(UserControl1.SelectedDataObject);

当然,您还必须将所选项目从DependencyProperty公开为UserControl1,以便将其传递给UserControl2