如何将模型的对象图的状态公开给viewmodel?

时间:2017-02-21 09:24:23

标签: c# wpf mvvm dependency-injection object-graph

我正在提高我对MVVM /依赖注入的最佳实践的理解,而且看起来很重要的东西仍然很不清楚。

情境:

  1. 模型(按Composition Root模式组成)包含一个类似于以下内容的DI对象图:
  2. Object graph

    1. 图表的组成部分(A1,B1等)具有状态。

    2. 组成部分的状态(A1.StateA1,B1.StateB1等)不仅仅作为图中其他对象的依赖关系,而且也需要出现在视图< / EM>

    3. 问题:

      • 如何正确地将此碎片/嵌套状态公开给viewmodel?

      如果我的理解是正确的,那么该模型不应该满足任何形式的可视化 - 视图模型的责任是根据视图的要求格式化数据。

      这是否意味着视图模型应该知道模型组合的细节,并直接参考例如B2.StateB2(甚至是A1.A2.B1.B2.StateB2)?

      • 或者,尝试将状态和行为分开并将所有状态存储在一个易于被视图模型使用的平面对象中是一种好习惯吗?

      我正在尝试做的具体细节:

      我正在设计的具体应用程序可作为业务应用程序(本地化软件)的简单扩展,以弥补在大型本地化项目中特别有用的一些缺失功能。我的应用程序的模型是从多个来源获取数据:

      • 一个来源是通过订阅Process.HasExitedAddAutomationFocusChangedEventHandler来跟踪目标应用的流程和窗口状态。
      • 另一个来源是PInvokes定期读取目标进程的私有内存。
      • 另外两个来源是XML(准确的XLIFF)文件,我需要根据我从目标进程内存中读取的最后一个值查找节点。此查找生成与本地化软件中的活动本地化单元相关的字符串列表 - 这是应用程序视图需要传达的主要信息。

      我承认该应用程序有点hacky,但最终用户生产力差异约为20%。 :)

      主视图模型相当简单,只有少数控件,包括一个WebBrowser,我正在填充已组装和格式化的HTML数据。这里的关键点是让数据始终保持最新,但我的模型对象为此目的实现了INotifyPropertyChanged。

1 个答案:

答案 0 :(得分:1)

  

或者,尝试将状态和行为分开并将所有状态存储在一个易于被视图模型使用的平面对象中是一种好习惯吗?

如果您指的是应用程序使用视图显示的状态,那么它应该被展平,或者更好地存储在ViewModel本身中。

模型在哪里获取数据?您可以将这些数据直接存储在ViewModel中,而不是创建一个仅用于在源和ViewModel之间保存数据的模型吗?

通常在MVVM开发中,IoC的Composition Root方法是使用ViewModel而不是模型完成的。