【问题标题】:MVP Pattern - Populating lists and grids in passive viewsMVP 模式 - 在被动视图中填充列表和网格
【发布时间】:2021-09-04 02:37:34
【问题描述】:

假设我的演示者从我的存储库中获取了我的 Person 类的列表,我想将该列表中的信息绑定到被动视图中的 ListBox 或 DataGridView。

由于视图不应该知道模型,我是否需要在演示者中将该列表转换为 List 并将其传递给视图以绑定到 ListBox 是否正确?

如果我想填充 DataGridView、List>,我应该向视图传递什么?

是否可以接受专门为视图绑定的模型,演示者将模型从存储库转换为视图的不同模型?

Person 模型示例:

public class PersonModel
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MiddleInitial { get; set; }
}

【问题讨论】:

  • 我今天学了一个新名词,被动视图!您可以将List<T> 绑定到DataGridView(或通过BindingSource 进行绑定)。你的代码不需要知道任何关于T 的信息,DGV 会解决这个问题。就个人而言,我会远离你的想法
  • @Flydog57 如果我不应该将模型传递给视图,我应该将什么类型 (T) 作为 List 传递?
  • 我不确定你的规则是什么,但在某些时候,你需要以某种方式将数据传递给视图。重要的事情(我假设)是您的视图与 T 无关。List<T> 类实现了IList,所以在视图中使用它。 DGV 仍会解决(我认为)
  • @Flydog57 您是否使用 MVP 模式,是否将模型传递给您的 MVP 应用程序中的视图?这是我尝试使用 MVP 模式的第一个项目,而 AFAIK,视图不应该知道模型。
  • 不,从未使用过 MVP。如果您对您的数据一无所知(例如,它的值),您如何呈现它?我写的是 WinForms 应用程序,它允许用户描述 SQL 查询(数据库可执行的任何内容)并呈现给用户(想想 SSMS)。在那种情况下,我只知道我有一个结果集合,都是相同类型(我不知道的类型)

标签: c# winforms mvp passive-view


【解决方案1】:

如果您使用真正的 MVP,您将在 Presenter 中获取您的 DataModel 列表并将它们映射到 ViewModel 列表,以便您的数据和视图层之间仍然存在关注点分离。因此,只需在客户端的 Models 文件夹中创建一个 ViewPerson.cs 类,复制与数据模型相同的属性,然后使用 AutoMapper 或自定义映射方法来映射每个属性。

【讨论】:

  • 如果我不完全放弃被动视图方法并采用监督控制器方法,我认为这就是我要努力的方向。使用监督控制器,演示者可以将模型传递给视图以进行绑定。也就是说,在 VS 2019 和 VS 2022 预览版 1 中从设计器编辑绑定的能力在 .Net 5/6 中用于 winforms 项目,因此暂时排除这种情况,除非我手动编辑设计器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多