Добавление моделей в список в presenter

#c# #.net #winforms #dependency-injection #mvp

#c# #.net #winforms #внедрение зависимостей #mvp

Вопрос:

В MVP presenter у меня есть следующий код. Здесь я пытаюсь создать список Model объектов (в данном случае IAttendance объектов) и отобразить их на a DataGridView в View .

Каждый раз, когда в представлении вводится посещаемость, AddAttendanceObjectToGrid() будет вызываться метод в presenter для добавления новой посещаемости в список.

 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:

Если я правильно понимаю проблему, вы хотите, чтобы сетка отображала недавно добавленный объект. Я вижу два способа

  • Замените Lis на ObservableCollection . ObservableCollection уведомит элемент управления Grid о добавленных элементах.
  • Сделайте трюк — BS.DataSource = null; BS.DataSource = AttendanceList;

Второй вариант будет намного медленнее, поскольку он вызовет очистку сетки и повторное заполнение ее всеми строками.

Редактировать: теперь я вижу, что список содержит несколько ссылок на один и тот же объект.Вы можете клонировать модель перед установкой в нее свойств.

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

Тогда IAttendance должен реализовать ICloneable.

Комментарии:

1. Проблема в том, что это AttendanceList.Add(_Model); добавляет ссылку на список. Итак, наконец, я получаю список одинаковых объектов (наконец-то добавлен один). Как это преодолеть?