0

我在 UI 中有一个与 List Control 绑定的ObservableCollection属性。ViewModelItemSource

为了在运行时更新列表控件中显示的项目数,我ObservableCollectionViewModel. 我使用了两种不同类型的代码片段,我将在下面分享它们,但仍然需要大量时间才能在列表控件中反映更新的数据。

代码片段 1:

public void AddRange(IEnumerable<T> items)
{
    foreach (var item in items)
        {
            this.Items.Add(item);           
        }
}

代码片段 2:

void BatchAddPeople(IEnumerable<Person> newPeople)
{
    var currentPeople = _people;

    // stop WPF from listening to the changes that we're about
    // to perform
    this.People = null;

    // change
    foreach (var person in newPeople)
    {
        currentPeople.Add(person);
    }

    // cause WPF to rebind--but only once instead of once for
    // each person
    this.People = currentPeople; //Updating the ObservableCollection property with complete list
}

我已经尝试了这两种方法,使用BackGroundWorker线程更新方法ObservableCollection内的代码Dispatcher.Invoke,但我仍然面临性能问题。

你们对如何减少这种情况下的性能损失有任何想法吗?

4

1 回答 1

0

是什么让您认为您所说的“性能下降”是由您向我们展示的代码引起的?在我看来,WPF 应用程序加载数据所花费的大部分时间实际上是由渲染引擎占用的。

如果您使用 aStopwatch来衡量您的 for 循环完成所需的时间,我相当确定它不会很长......对于 50,000 个或更多对象可能甚至不到四分之一秒:

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
foreach (var item in items)
{
    this.Items.Add(item);           
}
stopwatch.Stop();
TimeSpan elapsedTime = stopwatch.Elapsed; // I'm guessing this will not be a long time
于 2013-09-10T09:51:14.867 回答