如何在没有“祖父母”DataContext 的情况下更改 MVVM 中的整个视图?
How to change whole views in MVVM without “grandparent” DataContext?
我在 Internet 上看到的所有示例都有两个区域——一个区域用于按钮更改视图,另一个区域用于应由该按钮更改的视图。所以它一直有效,直到您尝试访问位于 "grand-parent" data-context 中的命令。但是,我想将整个视图更改为另一个视图而不划分区域或任何侧边栏并将数据从 View1 发送到 View2,然后更新 View1。
我正在尝试更改 MVVM 应用程序中的视图。例如,我有“ApplicationView”(一个包含 Views1(UserControl1) 和 View2(UserControl2) 的数据模板的主机)。这些用户控件有自己的数据上下文。
xaml ApplicationView 的是:
<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>
视图 1(UserControl1) 有自己的 DataContext:
并且视图 2(UserControl2) 也有自己的 DataContext:
我想要的是 select DataGrid 中的一个项目(Adam ),单击“编辑”按钮,然后 View1 应该被 View 2 替换,其中填充了数据网格中的数据。据我了解,我应该通过处理按钮“编辑”的命令来更改 View1,然后应显示 View 2,然后更改数据,然后应更新 View1。怎么做?
一些带有代码的示例将不胜感激!谢谢
您的示例类似于您提到的典型示例,只是您的视图按钮位于其中一个视图中。解决方案只是将 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);
当然,您还必须将所选项目公开为来自 UserControl1
的 DependencyProperty
,以便您可以将其传递给 UserControl2
。
我在 Internet 上看到的所有示例都有两个区域——一个区域用于按钮更改视图,另一个区域用于应由该按钮更改的视图。所以它一直有效,直到您尝试访问位于 "grand-parent" data-context 中的命令。但是,我想将整个视图更改为另一个视图而不划分区域或任何侧边栏并将数据从 View1 发送到 View2,然后更新 View1。
我正在尝试更改 MVVM 应用程序中的视图。例如,我有“ApplicationView”(一个包含 Views1(UserControl1) 和 View2(UserControl2) 的数据模板的主机)。这些用户控件有自己的数据上下文。 xaml ApplicationView 的是:
<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>
视图 1(UserControl1) 有自己的 DataContext:
并且视图 2(UserControl2) 也有自己的 DataContext:
我想要的是 select DataGrid 中的一个项目(Adam ),单击“编辑”按钮,然后 View1 应该被 View 2 替换,其中填充了数据网格中的数据。据我了解,我应该通过处理按钮“编辑”的命令来更改 View1,然后应显示 View 2,然后更改数据,然后应更新 View1。怎么做?
一些带有代码的示例将不胜感激!谢谢
您的示例类似于您提到的典型示例,只是您的视图按钮位于其中一个视图中。解决方案只是将 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);
当然,您还必须将所选项目公开为来自 UserControl1
的 DependencyProperty
,以便您可以将其传递给 UserControl2
。