我是WPF和MVVM模式的新手。我正在尝试像应用程序一样构建“一步一步”或“向导”。 因此,用户应首先登录然后选择一些数据,最后应将选定的数据存储在某处。 (这个流程永远不会改变!) 但是我决定为每个模板使用DataTemplates和不同的ViewModel,并为填充模板的Window使用MainViewModel。 (想想这里对于不同的帖子应该没问题)
但现在我的问题开始了。我知道如何从MainViewModel更改当前视图但我想从内部ViewModel更改当前视图。我希望能够从一个内部ViewModel收集数据到另一个内部,我不知道它是如何工作的。
MainViewModel:
public class MainWindowViewModel : ViewModelBase
{
public ViewModelBase CurrentView {get; set;}
public MainWindowViewModel()
{
CurrentView = new ViewModelA;
}
}
XAML:
<Window x:Class="PUSEImporter.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:VM="clr-namespace:PUSEImporter.ViewModel"
xmlns:V="clr-namespace:PUSEImporter.View">
<Window.DataContext>
<VM:MainWindowViewModel />
</Window.DataContext>
<Window.Resources>
<DataTemplate DataType="{x:Type VM:ViewModelA}">
<V:Detail />
</DataTemplate>
<DataTemplate DataType="{x:Type VM:ViewModelB}">
<V:Overview />
</DataTemplate>
</Window.Resources>
<ContentPresenter Content="{Binding CurrentView}"/>
</Window>
因此,想想ViewModelA中的按钮(或ViewModelA中的View),现在我想在有人点击按钮时切换到ViewModelB。 ViewModelA收集的数据也应该在ViewModelB中可用。
这可能是使用这种技术的首选方式还是我误解了一些概念? (如果这是真的,我应该如何处理这样的事情?)
提前致谢!
答案 0 :(得分:1)
有很多方法可以达到你想要的效果。在MVVM中,每个视图都有一个视图模型...因此,如果主视图有子视图,那么主视图模型应该具有另一个视图模型类型的属性。在这种情况下,您可以向子视图模型添加delegate
,并在主视图模型中为其注册处理程序。
这将使您能够从子视图模型有效地将信号传递到主视图模型,您可以以任何方式对父视图模型做出反应。不要在这里再次解释整个故事,请在Stack Overflow上的Passing parameters between viewmodels和How to call functions in a main view model from other view models?帖子中查看我的答案,了解有关如何实现此目的的更多信息。