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