WPF, MVVM: разрыв между моментом запуска OnPropertyChanged и обновлением пользовательского интерфейса - PullRequest
0 голосов
/ 16 ноября 2018

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

Спасибо

Pierre

1 Ответ

0 голосов
/ 16 ноября 2018

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

...