如何将模型对象图的状态暴露给视图模型?
How to expose the state of the model’s object graph to the viewmodel?
我正在加深对 MVVM / 依赖项注入最佳实践的理解,一些看似基本的东西仍然很不清楚。
场景:
- 模型(根据 Composition Root 模式组成)由类似于以下内容的 DI 对象图组成:
图的组成部分(A1、B1等)有状态
组成部分的状态(A1.StateA1、B1.StateB1等)不仅仅作为图中其他对象的依赖,还需要出现在视图中.
问题:
- 如何正确地将此 fragmented/nested 状态公开给视图模型?
如果我的理解是正确的,模型不应该迎合任何类型的状态可视化——根据视图的要求格式化数据是视图模型的责任。
这是否意味着视图模型应该了解模型组成的细节,并直接引用例如B2.StateB2(甚至 A1.A2.B1.B2.StateB2)?
- 或者,尝试将状态和行为分开,并将所有状态存储在易于被视图模型使用的平面对象中是否是一种好的做法?
我正在尝试做的事情的细节:
我正在设计的具体应用程序作为业务应用程序(本地化软件)的简单扩展,以弥补一些缺失的功能,这些功能在大型本地化项目中特别有用。我的应用模型正在从多个来源获取数据:
- 一个来源正在通过订阅
Process.HasExited
和 AddAutomationFocusChangedEventHandler
. 来跟踪目标应用程序的进程和 window 状态
- 另一个来源正在通过 PInvokes 定期读取目标进程的私有内存。
- 另外两个来源是 XML(确切地说是 XLIFF)文件,我需要根据从目标进程的内存中读取的最后一个值来查找节点。此查找生成与本地化软件中的活动本地化单元相关的字符串列表——这是应用视图需要传达的主要信息。
我承认该应用程序有点老套,但最终用户的工作效率存在大约 20% 的差异。 :)
主视图模型相当简单,只有几个控件,包括一个 WebBrowser,我正在用组装和格式化的 HTML 数据填充它。这里的关键点是让数据始终保持最新,但我的模型对象为此目的实现了 INotifyPropertyChanged。
Or, is it a good practice to try to separate the state and the behavior, and store all state in a flat object that is easy to consume by the viewmodel?
如果您指的是应用程序使用视图显示的状态,那么是的,它应该被展平,或者最好存储在 ViewModel 本身中。
模型从哪里获取数据?您能否将该数据直接存储在 ViewModel 中,而不是创建一个模型来仅在源和 ViewModel 之间保存数据?
通常在 MVVM 开发中,IoC 的组合根方法是通过 ViewModel 完成的,而不是模型。
我正在加深对 MVVM / 依赖项注入最佳实践的理解,一些看似基本的东西仍然很不清楚。
场景:
- 模型(根据 Composition Root 模式组成)由类似于以下内容的 DI 对象图组成:
图的组成部分(A1、B1等)有状态
组成部分的状态(A1.StateA1、B1.StateB1等)不仅仅作为图中其他对象的依赖,还需要出现在视图中.
问题:
- 如何正确地将此 fragmented/nested 状态公开给视图模型?
如果我的理解是正确的,模型不应该迎合任何类型的状态可视化——根据视图的要求格式化数据是视图模型的责任。
这是否意味着视图模型应该了解模型组成的细节,并直接引用例如B2.StateB2(甚至 A1.A2.B1.B2.StateB2)?
- 或者,尝试将状态和行为分开,并将所有状态存储在易于被视图模型使用的平面对象中是否是一种好的做法?
我正在尝试做的事情的细节:
我正在设计的具体应用程序作为业务应用程序(本地化软件)的简单扩展,以弥补一些缺失的功能,这些功能在大型本地化项目中特别有用。我的应用模型正在从多个来源获取数据:
- 一个来源正在通过订阅
Process.HasExited
和AddAutomationFocusChangedEventHandler
. 来跟踪目标应用程序的进程和 window 状态
- 另一个来源正在通过 PInvokes 定期读取目标进程的私有内存。
- 另外两个来源是 XML(确切地说是 XLIFF)文件,我需要根据从目标进程的内存中读取的最后一个值来查找节点。此查找生成与本地化软件中的活动本地化单元相关的字符串列表——这是应用视图需要传达的主要信息。
我承认该应用程序有点老套,但最终用户的工作效率存在大约 20% 的差异。 :)
主视图模型相当简单,只有几个控件,包括一个 WebBrowser,我正在用组装和格式化的 HTML 数据填充它。这里的关键点是让数据始终保持最新,但我的模型对象为此目的实现了 INotifyPropertyChanged。
Or, is it a good practice to try to separate the state and the behavior, and store all state in a flat object that is easy to consume by the viewmodel?
如果您指的是应用程序使用视图显示的状态,那么是的,它应该被展平,或者最好存储在 ViewModel 本身中。
模型从哪里获取数据?您能否将该数据直接存储在 ViewModel 中,而不是创建一个模型来仅在源和 ViewModel 之间保存数据?
通常在 MVVM 开发中,IoC 的组合根方法是通过 ViewModel 完成的,而不是模型。