这是我第一次尝试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信使适合这项任务吗?
答案 0 :(得分:1)
这是messenger / eventaggregator的完美场景。但是,您的消息链可能有点复杂。根据我的理解,您的主窗口包含一系列命令(如菜单或功能区)。以下是我看到事件链的方式。
答案 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的构造函数上允许该参数,并根据它执行任何其他操作。