Edw*_*uay 0 wpf mvvm application-design
我创建了一个MVVM测试应用程序,它在运行时读取XML文件以动态创建菜单,并根据用户选择的内容,动态加载该页面的UserControl.结果是一个很好的MVVM模式,允许您在XML文件中定义每页一个View/ViewModel对.非常好.
所以现在我只是添加了开发人员在一个页面上创建一个按钮的功能,该按钮可以转到另一个页面.我这样做的方法是在MainViewModel中构建ObservableCollection中的ViewModel集合,当我构建每个时,我将MainViewModel本身(this)注入每个UserControl-ViewModel的构造函数中.这样每个UserControl都包含MainViewModel,以便开发人员可以通过MainViewModel操作应用程序(例如调用SwitchPage(idCode)).
此外,我需要保存的任何全局状态都可以保存在每个UserControl都可以访问的MainViewModel中.
此外,每个UserControl(PageItem)都可以完全访问其他每个UserControl,这使我可以从任何UserControl基本上控制应用程序中的任何内容,这是我一直试图在MVVM应用程序中实现的很长一段时间.
所以我的问题是:这种ViewModel注入是一种有用/已知的模式,还是将ViewModel注入其子ViewModel时会出现问题?它似乎递归我,但似乎工作正常,并给了我迄今为止我想要的功能.根据我从Composite Application Library体系结构中学到的东西,这似乎与那里发生的事情类似,例如在下面的代码中,我可以根据需要将其他应用程序对象注入到我的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();
}
Run Code Online (Sandbox Code Playgroud)
我不认为这是错误或正确的,而是更多关于你的设计是如何耦合的.我通常从您提到的方法(子VM引用父VM)开始,然后解耦,如果我发现它太笨重.您的第一选择不一定是您的最后选择 - 您可以随着它的发展重构代码.
可能的选择是: