在使用ListViews时,如何使用Winforms的MVC模式?

时间:2009-10-09 02:12:50

标签: winforms model-view-controller mvp

我处理WinForms应用程序的旧方法是将所有逻辑抛入表单本身。

我正在尝试使用WinForms应用程序开始使用MVC / MVP。

有人能告诉我一个如何将MVC / MVP与ListView一起使用的例子吗?我使用ListView本身的Tag属性来存储ListView中表示的对象。

我意识到这是一种不好的做法,并将我与我的演讲紧密联系在一起,但我无法摆脱它。

例如,我有一个“Loot History”ListView,它显示了我从MMO中抢劫的项目列表。我使用每个新ListView项的“Tag”属性来存储“Loot”对象本身。因此,当我在战利品中执行删除或搜索时,我会搜索此列表视图的标记。

处理这种情况的正确方法是什么?

我的控制器类是否应该抓住我的战利品列表,并将其提供给我的表格?控制器是否实例化/拥有表单?如果没有,那么谁实例化呢?

2 个答案:

答案 0 :(得分:1)

如果它的工作方式与ASP.NET MVC类似,那么你的两个问题的答案都是肯定的。控制器会保留您的项目列表,并负责实例化表单。

如果您想“正确”,请查看Koossery.MVCwin如何做到这一点。他们关于控制器的陈述:

  

控制器是其中的组件   处理用户交互,使用   模型,最终选择一个视图   渲染显示UI。在MVC中   应用程序,视图只显示   信息;控制器处理   并响应用户输入和   相互作用。例如,   controller处理查询字符串   值,并将这些值传递给   模型,反过来查询   数据库使用值。

另见https://stackoverflow.com/questions/2406/looking-for-a-mvc-sample-for-winforms

答案 1 :(得分:0)

首先,您需要确定要使用的模式。 MVC和MVP略有不同。请查看 Twisting the Triad ,以便更好地了解它们之间的差异。

MVP进一步分为两种变体:Supervising Presenter/ControllerPassive View。我更倾向于倾向于Passive View,但在适当的时候,我的工作中发现一些监督演示者/控制器并不常见。我喜欢被动视图的原因是它尽可能多地将代码移出UI,并进入单独的类,可以更容易地进行单元测试。被动视图归结为将数据操作委派给Presenter,这通常会进一步将责任分散到域对象。 (不要与C#代理混淆,尽管这是实现它的一种方法)

像ListView,DataGridView(及其前身DataGrid)和TreeView这样的复杂UI控件可能成为MVP被动视图的障碍(监督演示者/控制器通常可以使用数据绑定来处理)。

  • 它们显示多个不同的数据值,这些数据值可能与单个域对象或多个域对象的属性重合。
  • 他们很少有精细的事件来处理更新个人数据值。

有时,最好的做法是找到一种显示数据的替代方法。在某些情况下,您可以使用表单和导航控件替换显示多行相关数据。其他时候不太清楚。根据我自己的经验,我已成功使用Tag属性来保存对该List Item所表示的域对象的引用,而View不知道它所存储的数据类型的任何信息。我通过将要显示的对象的字段作为系统类型并将对象本身作为普通的System.Object传递到视图中的Add()方法来完成此操作。

在View中创建一个不可测试的方法可能与MVP的整个观点相反,但它实际上只是多个属性的setter。该方法中没有数据操作或计算。所以无论如何都无法进行测试。

希望这有帮助。