【问题标题】:WPF mvvm DataTemplates change View from UserControlWPF mvvm DataTemplates 从 UserControl 更改视图
【发布时间】:2014-04-23 21:03:35
【问题描述】:

我是 WPF 和 MVVM 模式的新手。我正在尝试构建一个“逐步”或“向导”之类的应用程序。 所以用户应该首先登录然后选择一些数据,最后选择的数据应该存储在某个地方。 (这个流程永远不会改变!) 但是,我决定为每个模板使用 DataTemplates 和不同的 ViewModel,为填充模板的窗口使用 MainViewModel。 (认为​​这里的不同帖子应该没问题)

但现在我的问题开始了。我知道如何从 MainViewModel 更改当前视图,但我想从内部 ViewModel 更改当前视图。而且我希望能够从一个内部 ViewModel 收集数据到另一个,但我不知道这是如何工作的。

主视图模型:

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 中的视图),现在我想在有人单击该按钮时切换到 ViewModelB。并且 ViewModelA 收集的数据还不够,ViewModelB 也应该可用。

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

提前致谢!

【问题讨论】:

    标签: wpf mvvm datatemplate


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的快速回复。我将查看此链接!我考虑过代表,但无法评估这是否正确!
    • 是的,简单直接!在我看来,没有违反 MVVM。
    猜你喜欢
    • 2016-10-24
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2023-04-08
    • 2011-08-25
    相关资源
    最近更新 更多