生成视图模型



假设我有一个场景,我想显示一个由许多其他业务对象构建的业务对象,即它是深度分层的。

为了显示数据,我想使用 masterDetail 类型的视图,但有许多级别的视图让我可以越来越深入地挖掘数据。

因此,我想从对象根目录的某个列表中选择一个项目,并显示其属性的详细信息视图,然后从该详细信息视图中选择一个项目并显示其详细信息视图等。

如果我不与数据交互,则无需为深层层次结构中的每个模型创建 viewModels,因为我可以直接绑定到模型。

如果我正在与数据交互,那么我可能希望用视图模型包装整个业务对象及其后代,并绑定到该模型,从而允许我添加命令来执行某些逻辑。

但是,如果我只想与特定级别的数据交互,该怎么办?尝试直接从 XAML 或 codeBehind 与模型交互会很混乱。然而,用ViewModels包装整个事情是很多工作。

以为我只会使用转换器在特定点创建视图模型

<DisplayControl DataContext="{Binding A}">
   <DisplayControl DataContext="{Binding B}">
      <InteractionControl DataContext="{Binding C, Converter{ConvertModelToViewModel}}">
      </InteractionControl >
   </DisplayControl >
</DisplayControl >

但是,如果我随后需要对这些视图模型执行清理怎么办? 例如取消从事件中注册。每次我来回查看同一项目时,它都会为同一模型创建新的视图模型。我不想依赖垃圾收集,因为保留视图模型可能会很昂贵,具体取决于它们正在做什么,并且 GC 甚至可能不会发生(例如,如果我注册到静态类的事件)。使用弱事件将有助于GC,但在保持昂贵的视图模型比他们需要的时间更长的情况下,它仍然无济于事。

这个问题给出一个一般性的答案并不容易,因为它指的是 MVVM 应用程序的体系结构,并且需要考虑许多方面。它可能有助于对要做出的决策进行排序并提供一些最佳实践。对此的答案总是固执己见的,因为它涉及风格和品味问题......

如果没有相当多的基础结构,就无法构建现实生活中复杂的 MVVM 应用程序,而教程经常忽略这些基础结构。特别是对于视图,视图模型和模型的构建以及将所有内容粘合在一起,有许多概念可用。

只想告诉你我如何处理你提到的问题:

我从不直接绑定到模型。随着应用程序的增长,ViewModels往往会变得更加复杂,并且不包含任何其他逻辑方面的ViewModels(与模型相比)非常非常少。更改通知 (INotifyPropertyChanged) 是另一个方面:只要更改通知仅用于 UI 目的,就有必要将此方面隔离到 ViewModel。我建议为了可维护性和可扩展性而花费额外的精力。你不想仅仅因为你一开始忘记了什么而被迫进入一个主要的红标志。

实现基础结构来处理常见的 MVVM 任务,例如将 ViewModel 上的集合与视图上的集合同步。有关详细信息,请参阅此处的答案。我最终构建了一个ViewModelFactory,它处理ViewModels的构造和缓存。这甚至允许回收 ViewModels(取一个不再需要的 ViewModel 实例,只需切换模型,类似于回收模式下的 UI 虚拟化概念)。

当然,这不是对您的问题的完整回答,但我希望它可以帮助您走得更远。如果您有更具体的问题,请随时回复我。

相关内容

  • 没有找到相关文章

最新更新