【问题标题】:How would you use the MVC pattern with Winforms when it comes to using ListViews?在使用 ListViews 时,您将如何将 MVC 模式与 Winforms 一起使用?
【发布时间】:2009-10-09 02:12:50
【问题描述】:

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

我正在尝试在我的 WinForms 应用程序中使用 MVC/MVP 实践。

有人可以向我展示一个如何将 MVC/MVP 与 ListView 结合使用的示例吗?我使用 ListView 本身的 Tag 属性来存储 ListView 中表示的对象。

我意识到这是一种不好的做法,并且使我与我的演示紧密结合,但我很难摆脱它。

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

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

我的控制器类是否应该持有我的战利品列表,并将其提供给我的表单?控制器是否实例化/拥有表单?如果不是,那么谁来实例化它?

【问题讨论】:

    标签: winforms model-view-controller mvp


    【解决方案1】:

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

    如果您想“正确”,请查看Koossery.MVCwin 是如何做到的。他们关于控制器的声明:

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

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

    【讨论】:

      【解决方案2】:

      首先,您需要决定要使用哪种模式。 MVC 和 MVP 略有不同。查看 Twisting the Triad 以了解它们之间的差异。

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

      ListView、DataGridView(及其前身 DataGrid)和 TreeView 等复杂的 UI 控件尤其可能成为 MVP 被动视图的障碍(监督 Presenter/Controller 通常可以使用数据绑定来处理此问题)。

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

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

      在视图中创建一个不可测试的方法似乎与 MVP 的全部观点背道而驰,但它实际上只是多个属性的设置器。该方法中不发生数据操作或计算。所以无论如何都没有什么可以做的测试。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多