WPF mvvm DataTemplates从UserControl更改View

时间:2014-03-18 09:24:31

标签: wpf mvvm datatemplate

我是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中可用。

这可能是使用这种技术的首选方式还是我误解了一些概念? (如果这是真的,我应该如何处理这样的事情?)

提前致谢!

1 个答案:

答案 0 :(得分:1)

有很多方法可以达到你想要的效果。在MVVM中,每个视图都有一个视图模型...因此,如果主视图有子视图,那么主视图模型应该具有另一个视图模型类型的属性。在这种情况下,您可以向子视图模型添加delegate,并在主视图模型中为其注册处理程序。

这将使您能够从子视图模型有效地将信号传递到主视图模型,您可以以任何方式对父视图模型做出反应。不要在这里再次解释整个故事,请在Stack Overflow上的Passing parameters between viewmodelsHow to call functions in a main view model from other view models?帖子中查看我的答案,了解有关如何实现此目的的更多信息。