wpf mvvm使用命令在viewmodels之间传递参数

时间:2011-01-10 22:22:30

标签: wpf mvvm c#-4.0 mvvm-light

这是我第一次尝试MVVM。我的应用程序的核心是松散的Josh Smith的msdn文章。我也在使用mvvm light框架。

我有一个主窗口,其中包含一个命令列表区域和一个工作空间区域,它将用户控件/视图显示为tabitems,每个usercontrol都有一个相应的viewmodel。 mainWindow还有一个包含我的命令列表的viewmodel,而工作区viewmodel有一个基本工作区viewmodel。

我的默认视图有一个MappingSets的主数据网格,可以有一个选定的项目。这些命令启动新的tabitems,其中包含基于所选项处理MappingSet详细信息的视图。我有一个View / ViewModel,根据所使用的命令,它应该返回一个用于创建没有现有数据的新MappingSet的tabitem,或者包含要编辑的所选项的详细信息的tabitem,或者包含包含所选项的详细信息的tabitem新MappingSet的基础。

设置场景之后,我没有设法解决的是依赖于命令的方式传递参数,例如所选MappingSet对象的标识符,以在上述三种状态之一中实例化我的viewmodel?例如,mvvmlight信使适合这项任务吗?

2 个答案:

答案 0 :(得分:1)

这是messenger / eventaggregator的完美场景。但是,您的消息链可能有点复杂。根据我的理解,您的主窗口包含一系列命令(如菜单或功能区)。以下是我看到事件链的方式。

  1. 您从datagrid中选择MappingSet,这会导致MappingSetSelected消息被触发(使用所选MappingSet的有效内容)
  2. 主窗口侦听该消息并存储当前选定的MappingSet
  3. 当用户单击该按钮时,会触发“EditMappingSet”或“CreateNewMappingSet”消息(或者如果Window负责创建新视图,则会自行创建它们。)

答案 1 :(得分:0)

如果只有三个选项,您可以让它们绑定到三个不同的命令,并在命令中传递您自定义的变量。

private RelayCommand _openMappingSetCommand;

//Command that one of your options is bound to
public ICommand ViewMappingSetOption1
    {
        get
        {
            if (_openMappingSetCommand == null)
            {
                _openMappingSetCommand = new RelayCommand(param => this.DoTabRequest("your parameter");
            }
            return _openMappingSetCommand ;
        }
    }


// Method that creates your viewmodel
private void DoTabRequest(parameterType parameter)
    {
        WorkspaceViewModel viewModel = null;

        if (viewModel == null)
        {
            viewModel = (WorkspaceViewModel)Activator.CreateInstance(typeof (viewModelType), parameter);
            this.Workspaces.Add(viewModel);
        }

        this.ActiveWorkspace = viewModel;
    }

然后在viewmodel的构造函数上允许该参数,并根据它执行任何其他操作。