【发布时间】:2020-03-09 06:17:18
【问题描述】:
这是我的大型应用程序的简化版本,分为多个项目,这对我来说似乎很合乎逻辑。我也尝试过结合 MVVM 的一些原则,尽管我想避免过于繁琐地使用 Prism、eventtaggregators 等代码繁重的东西。
应用程序的工作方式是,您从列表中选择一只猫,文本框中的数字会自动添加到所选猫的年龄。并且当文本框中的数字发生变化时,该数字也会添加到所选猫的年龄:
解决方案的组织方式如下:
CatsView 和 ComputeView 用户控件被添加到 MainView 中并设置为它们各自的视图模型。 CatsViewModel 包含 SelectedCat 属性,当值发生变化时,它应该运行 ComputeViewModel 中的 Calculate 方法。 ComputeViewModel 包含文本框绑定的 YearsToAdd 属性,当它发生变化时,还会调用 Calculate 方法。
问题区域以红色突出显示。第一个问题是 CatsViewModel 没有对 ComputeViewModel 的引用,因此无法从那里调用 Calculate 方法。另一个问题是 ComputeViewModel 不知道选择的猫是什么。
我想也许 SelectedCat 属性可能是全局的,但这是不受欢迎的。另一种解决方案可能是将 MainViewModel 传递给子视图模型,但除非我添加对 Main 项目的引用,否则这将不起作用,但这是不可能的,因为它会导致循环依赖。
解决这个难题的方法是什么?
【问题讨论】:
-
没有看到你的代码是不可能帮助你的。但是,您应该避免拥有拥有自己的私有视图模型实例的控件。此类视图模型与应用程序的视图模型结构脱节,因此毫无用处。
-
那些你称之为“像 Prism、eventtaggregators 这样的代码繁重的东西”让你在这种情况下的生活更轻松。当您的项目规模扩大时,您的需求也会扩大。您需要的是跨组件通信。您可以实现创建具有可观察属性的共享单例服务,并从一个组件更新并从另一个组件监听。
-
Computeviewmodel 在我看来更像是一个模型类。为什么你不在用户提交更改并调用代码从猫的视图模型中进行计算时立即进行计算?然后它知道涉及的是什么猫。
标签: c# wpf mvvm data-binding viewmodel