0

我创建了一个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();
}
4

1 回答 1

6

我不认为这是错误或正确的,但更多的是关于你的设计是如何耦合的。我通常从您提到的方法开始(子 VM 引用父 VM),然后如果我发现它变得太笨重,就解耦。您的第一个选择不一定是您的最后一个选择 - 您可以随着代码的发展重构代码。

可能的替代方案是:

  • 子 VM 引发父级监听的事件(观察者模式)。父虚拟机非常了解孩子,但孩子不了解父母。
  • 子 VM 在父侦听的事件中心上发布事件(中介模式)。孩子和父母都没有密切了解彼此。他们只知道调解员。
于 2009-06-23T08:22:50.887 回答