0

UI のリスト コントロールにバインドされたObservableCollectionプロパティがあります。ViewModelItemSource

実行時に List Control に表示されるアイテムの数を更新するために、 のObservableCollectionプロパティにアイテムを追加していますViewModel。以下で共有する 2 つの異なるタイプのコード スニペットを使用しましたが、リスト コントロールに更新されたデータを反映するのに非常に時間がかかります。

コード スニペット 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を更新するスレッドを使用してこれらの両方のアプローチを試しましたが、それでもパフォーマンスの問題に直面しています。ObservableCollectionDispatcher.Invoke

この場合、パフォーマンスへの影響を減らす方法について何か考えがありますか?

4

1 に答える 1

0

あなたが「パフォーマンス ヒット」と呼んでいるものは、あなたが私たちに示したコードによって引き起こされていると、どのように考えていますか? 私の意見では、WPF アプリケーションがデータをロードするのにかかる時間の大半は、実際にはレンダリング エンジンによって占められています。

for ループが完了するのにかかる時間を測定するためにa を使用する場合Stopwatch、それはまったく長くはないと確信しています...おそらく、50,000 個以上のオブジェクトでは 4 分の 1 秒でさえありません。 :

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 に答える