【问题标题】:How to pass properties between projects in a WPF app?如何在 WPF 应用程序中的项目之间传递属性?
【发布时间】:2020-03-09 06:17:18
【问题描述】:

这是我的大型应用程序的简化版本,分为多个项目,这对我来说似乎很合乎逻辑。我也尝试过结合 MVVM 的一些原则,尽管我想避免过于繁琐地使用 Prism、eventtaggregators 等代码繁重的东西。

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

Application Layout

解决方案的组织方式如下:

Code Organization

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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢@Noceo,我会考虑到这一点。我组织解决方案的方式背后的想法是将其分成功能区域,假装每个项目都是由不同的人完成的。这样,每个项目都将包含与该项目的一般功能领域相关的所有内容,包括 GUI 和非 GUI 内容。仍然不知道哪种方法最好。
猜你喜欢
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 2012-09-20
  • 1970-01-01
相关资源
最近更新 更多