#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);
добавляет ссылку на список. Итак, наконец, я получаю список одинаковых объектов (наконец-то добавлен один). Как это преодолеть?