我创建了一个MVVM 测试应用程序,它在运行时读取 XML 文件以动态创建菜单,并根据用户选择的内容动态加载到该页面的 UserControl 中。结果是一个很好的 MVVM 模式,它允许您在每个页面中拥有一个 View/ViewModel 对,所有这些都在 XML 文件中定义。非常好。
所以现在我只是为开发人员添加了在一个页面上创建一个按钮的功能,该按钮可以转到另一个页面。我这样做的方法是在 MainViewModel 我在 ObservableCollection 中构建 ViewModel 的集合,当我构建每个时,我将 MainViewModel 本身(this)注入每个 UserControl-ViewModel 的构造函数中。这样,每个 UserControl 内部都有 MainViewModel,以便开发人员可以通过 MainViewModel 操作应用程序(例如调用 SwitchPage(idCode))。
此外,我需要保存的任何全局状态都可以保存在每个 UserControl 可以访问的 MainViewModel 中。
此外,每个 UserControl (PageItem) 都可以完全访问其他每个 UserControl,这使我基本上可以从任何 UserControl 控制应用程序中的任何内容,这是我长期以来一直试图在 MVVM 应用程序中实现的。
所以我的问题是:这种 ViewModel 注入是有用/已知的模式,还是将 ViewModel 注入其子 ViewModel 是否存在问题?它对我来说似乎是递归的,但似乎工作正常,并为我提供了迄今为止我想要的功能。从我从复合应用程序库架构中学到的知识来看,这似乎与那里正在发生的事情相似,例如,在下面的代码中,我可以根据需要将其他应用程序对象注入到我的 ViewModel 中。
public MainViewModel()
{
PageItems pageItems = PageItems.Create("all");
foreach (PageItem pageItem in pageItems.Collection)
{
string assemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
string viewModelName = assemblyName + ".ViewModels.PageItem" + StringHelpers.ForcePascalNotation(pageItem.IdCode) + "ViewModel";
var type = Type.GetType(viewModelName);
var viewModel = Activator.CreateInstance(type, this, pageItem) as ViewModelPageItemBase;
AllPageItemViewModels.Add(viewModel);
}
CurrentPageItemViewModelIndex = 0;
LoadCurrentPageItemViewModel();
}