OnPropertyChanged со списком - PullRequest
       5

OnPropertyChanged со списком

0 голосов
/ 28 сентября 2010

У меня есть сетка данных в представлении, которое связано со списком в модели представления. У меня есть много данных, которые нужно извлечь для списка, поэтому я хочу разбить его на множество мелких поисков вместо одного большого.

Я хочу, чтобы это происходило в фоновом потоке с обновлением пользовательского интерфейса (сетка, связывающая новые данные) в конце каждого полученного пакета.

В конце каждого поиска я делаю List.AddRange () на частном бэкере, затем вызываю событие OnPropertyChanged, передавая имя открытого свойства, к которому привязана сетка.

Первоначально я пробовал это с 6 итерациями, которые получают по 100 элементов в каждой. При работе в фоновом режиме пользовательский интерфейс будет обновляться после первых 100, но не обновлять последние 500 (даже если данные были успешно добавлены в базовый список в модели представления).

Думая, что у меня возникли некоторые проблемы с маршалингом потока пользовательского интерфейса, я запустил его синхронно, ожидая, что он будет работать как положено (хотя блокирует пользовательский интерфейс при каждом извлечении) или заблокирует пользовательский интерфейс во время всех поисков - но в любом случае , обновление в конце, чтобы показать 600 пунктов. Тем не менее, он в конечном итоге делает то же самое, что и при запуске в фоновом режиме - обновляет только первые 100, а не остальные.

Ниже приведен метод, который я использую с обеими попытками, верхняя половина - закомментированная фоновая версия.

Что я делаю не так?

public void StartDataStream()
{
    //Task<List<Car>> task = _taskFactory.StartNew(this._retrieveData);

    //task.ContinueWith(t =>
    //{
    //    if (this._cars == null) this._cars = new List<Car>();

    //    this._cars.AddRange(t.Result);
    //    base.OnPropertyChanged("Cars");

    //    this.iterations += 1;
    //    if (iterations < 6) StartDataStream();
    //});

    if (this._cars == null) this._cars = new List<Car>();

    this._cars.AddRange(this.GetCarList(eq,s,e));
    base.OnPropertyChanged("Cars");

    this.iterations += 1;

    if (iterations < 6) StartDataStream();
}

1 Ответ

1 голос
/ 28 сентября 2010

Вы пытались использовать ObservableCollection<T> вместо List<T>

Я предполагаю, что у вас есть публичная собственность, которая называется Автомобили, похожие на ...

public List<Car> Cars{

   get { return this._cars;}
   set
   {
      this._cars = value;
      base.OnPropertyChanged("Cars");
   }

}

Если нет, то это будетна самом деле ничего не делать ... base.OnPropertyChanged("Cars");

Метод расширения AddRange для ObservableCollection

public static class Extensions
{
    public static void AddRange(this ObservableCollection obj, List<T> items)
    {
        foreach (var item in items)
          obj.Add(item);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...