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");
    }
}

ObservableCollectionMyVars устанавливается при обращении к базе данных. В основном то, что происходит, это задержка между призывом к 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, и будет реагировать соответствующим образом при добавлении / удалении элементов.

Другие вопросы по тегам