Я реализовал простые ванильные приложения 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
PDM 16 Ноя 2018 в 14:52

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

2
Peregrine 16 Ноя 2018 в 14:57