将模型添加到演示者的列表中

时间:2014-06-16 17:52:18

标签: c# .net winforms dependency-injection mvp

在MVP演示者中,我有以下代码。我在这里尝试的是创建Model个对象列表(在本例中为IAttendance个对象),并在DataGridView中的View上显示它们。

每次在视图上输入出勤时,都会调用演示者上的AddAttendanceObjectToGrid()方法将新的出勤添加到列表中。

class AttendancePresenter : BasePresenter
{
    private IAttendance _Model;
    private readonly IAttendanceView _View;

    BindingSource BS = new BindingSource();
    List<IAttendance> AttendanceList = new List<IAttendance>();

    public AttendancePresenter( IAttendance model, IAttendanceView view )
    {
        _Model = model;
        _View = view;
    }

    private void AddAttendanceObjectToGrid()
    {
        SetModelPropertiesFromView(_Model, _View); // Call base class method to update the Model with data

        AttendanceList.Add(_Model); // Add new model to list
        BS.DataSource = AttendanceList; // Show list on the grid
        _View.AttendanceInGrid = BS;
    }
}

每次我添加对模型的引用时,所有对象都在列表中相同。如何解决这个问题呢?

如果解决方案是在我的模型中使用复制构造函数,请告诉我如何?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了问题,您希望Grid显示新添加的对象。我看到两种方式

  • 用IlservableCollection替换Lis。 ObservableCollection将通知Grid控件有关添加的元素。
  • 做一招 - BS.DataSource = null; BS.DataSource = AttendanceList;

第二个选项会慢很多,因为它会触发清除Grid并按所有行重新填充它。

编辑: 该列表包含对同一对象的多个引用,我现在看到。您可以在将属性设置到其中之前克隆模型。

_Model = (IAttendance)_Model.Clone();
SetModelPropertiesFromView(_Model, _View);
AttendanceList.Add(_Model);

IAttendance应该实施ICloneable。