Обновление TreeView ItemsSource в другом потоке

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

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

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

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

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

Спасибо

1 ответ

Решение
  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

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