【发布时间】:2013-05-06 17:15:19
【问题描述】:
简介
我有一个在运行时导入实验室仪器数据的应用程序。导入此数据,然后以最终用户根据其测试要求设置的时间间隔显示在ListView 中。当他们关注的ListView 中出现感兴趣的值时,他们会按下“开始”按钮,应用程序开始对该数据和后续数据执行计算,直到按下“停止”按钮。因此,屏幕左侧是一个视图,用于显示导入的数据,右侧是另一个视图,用于查看计算和显示的值和统计数据。
当前代码
显示导入数据的 ListView 的视图是 ImportProcessView.xaml,它将其DataContext 设置为ImportProcessViewModel.cs。我刚刚介绍的 VM 有一个属性ObservableCollection<IrData>,我刚刚描述的 ListView 绑定到该属性。现在到有趣的部分...
ImportProcessView 有一个 ContentControl 动态设置它的内容,一个 UserControl 表示特定于最终用户选择的阶段类型的控件和字段。
<StackPanel Background="White" Margin="5">
<ContentControl Content="{Binding CurrentPhaseView}"/>
</StackPanel>
共有三个PhaseViews,每个都在自己的用户控件中,每个都将其DataContext 设置为ImportProcessViewModel。结果,我得到了一些严重的 VM 膨胀,达到 2000 行。荒谬的。我知道。膨胀的原因是ImporProcessViewModel 通过三个 PhaseView 中的每一个的属性来维护状态,不仅如此,还包含执行计算的方法,其数据存储并显示在这些“PhaseView”中。
我正在努力实现的目标
显然,在ImportProcessViewModel 变得更加笨拙之前,我需要将其分解,以便每个 PhaseView 都有自己的 ViewModel,而且为了 ObservableCollection 施加的依赖关系,每个 ViewModel 都保持与 ImportProcessViewModel 的关系IrData.
研发
我对 ViewModel 之间的通信进行了研究,但大多数 results 涉及使用特定 MVVM 框架编写的应用程序。我没有使用框架,在项目的这一点上,重构它以开始使用框架为时已晚。
然而,我确实找到了这个article,'hbarck' 提供的答案建议像组合这样简单的东西来实现我想要的结果,但由于我对 DataTemplates 没有太多经验,所以我不明白什么意思是当他/她建议将“UserControl 的 ViewModel 作为主 ViewModel 上的属性,并将 ContentControl 绑定到该属性,然后通过 DataTemplate 实例化 View(即 UserControl)”
具体来说,我不明白 “将 ContentControl 绑定到此属性,然后 通过 DataTemplate 实例化视图” 是什么意思。
有人可以通过代码示例阐明在此示例的上下文中通过 DataTemplate 实例化视图是什么意思吗?
此外,这是一个好方法吗(正如“hbarck”所建议的那样)?
正如所见,我已经将 ContentControl 的 Content 属性设置为要实例化的阶段视图。我只是不知道涉及 DataTemplate 会是什么样子。
【问题讨论】:
-
本杰明已经讲述了这个话题的一切。但这是另一个例子:codeproject.com/Articles/35277/MVVM-Mediator-Pattern.