【发布时间】:2014-07-15 06:10:46
【问题描述】:
我目前正在为我们即将推出的基于 WinForms 和 MVP 设计模式的项目准备核心框架。
我不确定,最好的方式是什么,如何在两个视图/演示者之间进行通信。更具体地说 - 我有一个 ListView 和一个 DetailView。当用户单击 ListView 中的某个项目时,我需要显示该项目的编辑表单,在我的例子中是 DetailView。
选项:
ListPresenter 是否应该在点击事件上创建 DetailPresenter? (工厂可能会有所帮助。)
是否应该在 ListPresenter 构造函数中注入 DetailPresenter 的实例?
我觉得 2) 可能是“正确”的解决方案,但我更愿意在我真正需要的时候创建 DetailView/DetailPresenter - 即当用户单击按钮时。
下一个问题,我不知道该怎么做是对象的生命周期。当我将 View 注入 Presenter 时,谁负责清理?我已经习惯了由创建它的同一方进行清理的行为。但在这种情况下,我可以想象 View 可以由 Presenter 处理。
我希望这些问题不要太笼统,我已经阅读了很多关于 MVC/MVP 的文章,但它们大多只是展示了如何实现单个 View-Presenter 通信。
谢谢。
【问题讨论】:
-
winforms 不推荐用于任何新项目。您应该认真考虑改用当前的相关技术。
-
我知道 WinForms 已经有一段时间没有更新了,而且可能永远不会更新,但是对于某些项目,在我看来,它仍然是完全有能力的技术。无论如何,桌面 .NET 应用程序还有什么其他选择? WPF?仅仅因为它具有非常好的数据绑定能力,它并不能使它成为所有项目的完美解决方案。我们考虑过使用它,但还是决定使用 WinForms。
-
perfectly capable technology- 直到您需要一些看起来不像 Windows 3.1 的东西,或者直到您需要将 UI 与应用程序的行为正确分离。what other choice is there for a desktop .NET application?- WPF 是 .Net Windows 桌面 UI 的首选技术。无论您使用 winforms 可以实现什么,您也可以在 WPF 中以 10% 的代码量实现相同的效果。更不用说创建出色用户体验的可定制性和易于开发。 -
好吧,我不会同意 WinForms 与 WPF。我都使用过,对于某些项目,它是 WPF,对于其他项目,我宁愿使用 WinForms。但是,即使对于 MVVM,这个问题也是有效的。您单击一个按钮,您的 ViewModel 接收到命令,现在呢?它是自己创建 DetailViewModel 还是应该期望 DetailViewModel 被注入 ListViewModel 构造函数?另外,谁负责对象的生命周期?同样的问题,不管是 WinForms 还是 WPF。
-
在 MVVM 中,ViewModel 负责它们的“子”或“详细”VM 生命周期,并且视图只需通过 DataBinding 对其进行响应,而无需额外的管道。