使用MVP模式时,我应该在哪里创建ListViewItem列表?

时间:2009-03-06 14:31:48

标签: c# winforms design-patterns

我有一个小编写的应用程序使用MVP模式,如下所示:

  • 我创建了一个名为IView的接口
  • 我在表单
  • 中实现了此接口
  • 将表单实例作为类型IView传递到演示者的构造函数

表单包含ListView组件。填充ListView的项目在演示者中创建。我听说在演示者中使用UI组件类不是一个好主意。我应该如何以及在何处创建这些ListViewItems?我可以在表单本身创建ListViewItems,但是表单不需要尽可能轻量级而没有逻辑吗?

编辑:N.B。这是一个Windows窗体应用程序

5 个答案:

答案 0 :(得分:2)

  

我可以在中创建ListViewItems   形式本身,但不是形式   需要尽可能轻量级   没有逻辑吗?

一个简单的循环,并不认为简单的对象创建是困难的。对于View来说,这样的代码相当轻量级:

class SomeView 
{
  void SetData(IEnumerable<DataItem> dataItems) 
  {
    foreach(DataItem dataItem in dataItems) 
    {
      ListViewItem lvi = new ListViewItem();
      lvi.Text = dataItem.Text;
      ...
    }
  }
}

此外,您可以使用Binding(如其他人建议的那样)。这将进一步简化SetData。

尽量保持查看代码非常简单,您可以通过快速代码审查来“验证”它: - )

答案 1 :(得分:1)

ListViewItems是特定于视图的,因此您应该在视图中创建它们。如果您在演示者中创建它们,则所有视图都必须依赖于ListViewItems,这是不好的。

答案 2 :(得分:1)

在演示者中创建数据项。将这些分配给视图并让视图使用数据绑定来显示数据项:

//in presenter
var dataItems = _someService.GetData();
_view.Data = dataItems;

//in view code-behind
public ICollection<DataItem> Data
{
    get; set; //omitted for brevity - will require change notification
}

//in view XAML
<ListView ItemsSource="{Binding Data}">
  <ListView.View>
    <GridView>
      <GridViewColumn DisplayMemberBinding="{Binding Path=Name}"/> 
      <GridViewColumn DisplayMemberBinding="{Binding Path=Age}"/> 
    </GridView>
  </ListView.View>
</ListView>

答案 3 :(得分:0)

我最近有同样的难题,但是对于树视图。

要很好地解决它,您必须使用委托来处理数据到可视元素的创建/转换。

示例:

class View
{
  TreeNode Builder(object foo, object bar) { ... }
}

class Presenter
{
  void InitView(View v)
  {
    Model.Build(v.Builder);
  }
}

好的,这非常粗糙,但它可以让你很容易地构建像树一样的递归结构。 :)

注意:模型和视图实际上并不关心彼此的类型。

答案 4 :(得分:0)

WinForms因为技术不是为MVP设计的,所以关注分离的好主意应该有理由。 我希望控制形式,演示者应该没有视图特定的东西。任何控件本身都打破了mvp,因为它包含数据和表示。随着您的应用程序的增长,保持MVP风格将变得越来越难。实施MVP没有多大好处。 通常,使用WinForms传统的控件风格(组件式)效果很好。