这是我的大型应用程序的简化版本,分为多个项目,对我来说这似乎很合乎逻辑。我也尝试融入MVVM的一些原理,尽管我想避免陷入像Prism、事件聚合器等代码密集的东西的杂草中。
该应用程序的工作方式是,你从列表中选择一只猫,文本框中的数字会自动添加到所选猫的年龄中。当文本框中的数字发生变化时,该数字也会添加到所选猫的年龄中:
应用程序布局
以下是解决方案的组织方式:
代码组织
CatsView和ComputeView用户控件添加到MainView中,并设置为各自的视图模型。CatsViewModel包含SelectedCat属性,当值更改时,它应该在ComputeViewModel中运行Calculate方法。ComputeViewModel包含文本框绑定到的YearsToAdd属性,当它更改时,还会调用Calculate方法。
问题区域以红色突出显示。第一个问题是CatsViewModel没有对ComputeViewModel的引用,因此无法从中调用Calculate方法。另一个问题是ComputeViewModel不知道所选的猫是什么
我想SelectedCat属性可能是全球性的,但这是不可取的。另一个解决方案可以是将MainViewModel传递到子视图模型中,但除非我添加对Main项目的引用,否则这是不可行的,但这是不可能的,因为这会导致循环依赖。
这个难题的解决办法是什么?
对于您这样规模的项目,我会将所有用户界面的东西(这也意味着视图模型(放在主项目中(然后将是WinForms/WPF/UWP应用程序(。我将把它称为用户界面。您的其他项目将是类库,根本没有GUI内容。
用户界面将需要对两个类库的引用(它将依赖于它们(,但其他项目将不知道用户界面(因此它们将不依赖于任何东西(。
在需要时,视图模型将能够从类库中调用方法,但重要的是要声明(在类库中(调用的方法严格与GUI无关。