【发布时间】:2015-06-07 22:14:06
【问题描述】:
正如标题所暗示的,这个问题专门寻找解决方案(或避免的方法)我在直接从 XAML 创建视图模型的应用程序中遇到的问题(没有对对象的代码引用)。
这是一个成熟、功能齐全且完全 MVVM 应用程序 - 在各个领域,视觉对象通常被添加到 XAML 主窗口或弹出窗口的部分中,如下所示:
<viewModels:MyViewModel MyDependencyProperty="{Binding}" />
在这些情况下,ViewModel 的实例是通过无参数构造创建的,我们有时会如上所示初始化依赖属性。
主 XAML 窗口具有主视图模型的 DataContext - ApplicationViewModel。大多数情况下,我们所有的视图都是资源字典,其样式定义了视图模型目标类型的各种模板。这些被拉入我们皮肤 XAML 文件中的合并字典中。
问题1
有时,应用程序周围的其他对象需要与 ApplicationViewModel 交互。但是,在实例化时,XAML 或其他方式中没有可用的引用 - 导致过度使用静态 ApplicationViewModel 实例(不好)。
问题 2
我们的 XAML 实例化对象通常会有事件挂钩和可视元素,需要显式取消挂钩/处置。我们的可视化树非常大而且非常复杂,因为我们在代码中没有对视图模型的任何引用,所以管理处置和避免内存增长的开销不断增加 - 并且将主窗口与任何视图模型或可视化一起丢弃可能导致它留在记忆中的元素 - 是一个持续的挑战。
我不是在这里要求任何代码,更多的是对您解决这些问题的方法/经验的描述。
由于各种原因,我无法提供代码 - 主要原因是需要演示的内容太多!
更新
仅供参考,关于该应用程序的另一件重要的事情是不断创建新的 ViewModel 项目,这些项目代表丰富的项目,这些项目出现在许多不断滚动的列表中,这些列表在选项卡中可用。从这些列表中的每一个中,都有许多命令操作、弹出对话框和其他需要下游 ViewModel 创建的功能(目前是按需创建的)。这些列表支持各种触摸手势,包括轻弹/动量滚动、滑出菜单、触摸扩展和拖放,更不用说包含矢量图像和动画的丰富显示了!
【问题讨论】:
-
你使用依赖注入来创建 ViewModels 吗?
-
您使用的是用户控件还是数据模板?
-
@Contango DataTemplates(和 ControlTemplates)。如前所述,样式位于资源字典中并合并到 XAML 外观中。组合中还有几个自定义用户控件。