首页 > 解决方案 > 如何在 WPF 应用程序中的项目之间传递属性?

问题描述

这是我的大型应用程序的简化版本,分成多个项目,这对我来说似乎很合乎逻辑。我还尝试将 MVVM 的一些原则结合起来,尽管我想避免被 Prism、eventtaggregators 等代码繁重的东西困在杂草中。

该应用程序的工作方式是,您从列表中选择一只猫,文本框中的数字会自动添加到所选猫的年龄。当文本框中的数字发生变化时,该数字也会添加到所选猫的年龄:

应用布局

以下是解决方案的组织方式:

代码组织

CatsView 和 ComputeView 用户控件添加到 MainView 中并设置为各自的视图模型。CatsViewModel 包含 SelectedCat 属性,当值发生变化时,它应该运行 ComputeViewModel 中的 Calculate 方法。ComputeViewModel 包含文本框绑定的 YearsToAdd 属性,当它发生变化时,还会调用 Calculate 方法。

问题区域以红色突出显示。第一个问题是 CatsViewModel 没有对 ComputeViewModel 的引用,因此无法从那里调用 Calculate 方法。另一个问题是 ComputeViewModel 不知道选择的猫是什么。

我想也许 SelectedCat 属性可能是全局的,但这是不受欢迎的。另一种解决方案可能是将 MainViewModel 传递给子视图模型,但除非我添加对 Main 项目的引用,否则这将不起作用,但这是不可能的,因为它会导致循环依赖。

这个难题的解决方案是什么?

标签: c#wpfmvvmdata-bindingviewmodel

解决方案


对于您大小的项目,我会将所有用户界面内容(这也意味着视图模型)放在主项目中(然后将是 WinForms/WPF/UWP 应用程序)。我将其称为用户界面。您的其他项目将是类库,根本没有 GUI 内容。

然后,用户界面将需要对您的两个类库的引用(它将依赖于它们),但其他项目将不知道用户界面(因此它们不会依赖任何东西)。

需要时,视图模型将能够从您的类库中调用方法,但重要的是要声明调用的方法(在类库中)严格与 GUI 无关。


推荐阅读