Обновление TreeView ItemsSource в другом потоке - PullRequest
0 голосов
/ 31 марта 2012

У меня есть такая функция:

public void UpdateList()
{
BindList = Model.GetList();
TreeView1.ItemsSource = BindList;
}

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

Я довольно новичок в WPF ... в программах WinForms, которые я использовал для создания делегатов и проверки InvokeRequired и т. Д. Но яЯ обнаружил, что это не работает в WPF.

Так что, если я хочу вызвать UpdateList () так, чтобы он работал в другом потоке, а ItemsSource обновлялся из этого другого потока, как мне это сделать?

Спасибо

1 Ответ

1 голос
/ 01 апреля 2012
  1. Изменить функцию Model.GetList() на свойство типа ObservableCollection<> Например:

    public ObservableCollection<DataItem> List { get; set; }

  2. Звоните TreeView1.ItemsSource = Model.List только один раз. Это дает вам преимущества привязки WPF.

  3. Создайте BackgroundWorker для загрузки данных в обработчик DoWork. Загрузите данные во временную коллекцию и скопируйте эту коллекцию в обработчик Model.List в обработчике RunWorkerCompleted.
    Если вы хотите обновить дерево во время загрузки данных, вы можете воспользоваться следующим подходом: Связывание обновления WPF в фоновом потоке

  4. Прочитайте и изучите Шаблон MVVM , чтобы понять основную идею разработки WPF

...