WPF, MVVM: разрыв между моментом запуска OnPropertyChanged и обновлением пользовательского интерфейса
Я реализовал простые ванильные приложения MVVM. У меня есть датагрид, связанный с ObservableCollection
, Когда база данных обновляется, коллекция обновляется, OnPropertyChanged
правильно запущен, но есть задержка, прежде чем пользовательский интерфейс обновляется должным образом. Я могу сказать это, потому что когда я отлаживаю, я вижу, что между моментом OnPropertyChanged
уволен и get
соучастник ObservableCollection
называется. Задержка, по-видимому, не коррелирует с количеством рядов (то есть 5 или 50 рядов, кажется, что имеется одинаковое запаздывание).
Где я могу начать выяснять, откуда происходит это отставание?
Код: это просто ванильный MVVM отсюда:
private ObservableCollection<MyVar> _MyVars;
/// <summary>
/// List of pnl
/// </summary>
public ObservableCollection<MyVar> MyVars
{
get
{
return _MyVars;
}
set
{
_MyVars = value;
OnPropertyChanged("MyVars");
}
}
ObservableCollection
MyVars
устанавливается при обращении к базе данных. В основном то, что происходит, это задержка между призывом к OnPropertyChanged("MyVars");
и призыв к return _MyVars;
, MyVars
является источником элементов для сетки данных. Как при выпуске, так и при отладке, для обновления сетки данных требуется несколько секунд, и я обнаружил, что между двумя вызовами, о которых я упоминал выше, возникает задержка. Я не могу поместить больше кода, чем это, мне просто интересно, если у кого-то была такая же ситуация и какой путь он / она выбрал для отладки и решения проблемы.
Спасибо,
пьер
1 ответ
Почему вы повторно задаете свойство ObservableCollection? Просто создайте его один раз и добавляйте / удаляйте элементы по мере необходимости.
private ObservableCollection<MyVar> _myVarsCollection = new ObservableCollection<MyVar>();
public IEnumerable<MyVar> MyVars => _myVarsCollection;
public void AddMyVar(MyVar myVar)
{
_myVarsCollection.Add(myVar);
}
public void AddMyVars(IEnumerable<MyVar> myVars)
{
foreach(var myvar in myVars)
AddMyVar(myvar);
}
public void RemoveMyVar(MyVar myVar)
{
_myVarsCollection.Remove(myVar);
}
Даже если _myVarsCollection не является общедоступным, любой элемент управления, связанный с MyVars, обнаружит, что он реализует INotifyCollectionChanged, и будет реагировать соответствующим образом при добавлении / удалении элементов.