2

MVVM パターンで ObservableCollection を WPFToolkit DataGrid にバインドしています。30 秒ごとに、サービスにデータを照会するバックグラウンド スレッドがあります。戻ると、それを UI スレッドにマーシャリングし、最初にコレクションに対して Clear() を呼び出し、次に各項目に対して Add() を呼び出すことによって、ObservableCollection を更新します。この場合、データは画面に正しく更新されますが、データグリッドがちらつきます。どうすればこれを防ぐことができますか?

4

2 に答える 2

2

あなたの問題に対して、シンプルだが最大の強力なソリューションを作成しました。

public class MyCollection<T> : ObservableCollection<T>
{
    private bool _isInEditMode = false;

    public void BeginEdit()
    {
        _isInEditMode = true;
    }

    public void CommitEdit()
    {
        _isInEditMode = false;
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        if (_isInEditMode == false)
        {
            base.OnCollectionChanged(e);
        }
    }
}

my collection クラスは、編集モード中にコレクションが変更されたイベントを防ぎます。アイテムをクリアする前に「BeginEdit」を開始します。次に、新しいアイテムを追加します。終了したら、「CommitEdit」を使用すると、ビューが一度だけ更新されます。

単純なリストボックスでテストした場合、1.000.000 文字列項目を追加します。これを試してみてください。それはおかしいです :)

 private void Button_Click(object sender, RoutedEventArgs e)
    {
        MyCollection<string> list = testBox.ItemsSource as MyCollection<string>;
        //list.BeginEdit();
        for (int i = 0; i < 1000000; i++)
        {
            list.Add("test " + i);
        }
        list.CommitEdit();

    }

// を list.BeginEdit() から削除して、違いを確認してください。その約 15 秒に対して 1 秒未満です。

ご挨拶、

1月

于 2010-08-10T13:03:14.040 に答える
1

クリアしてから各項目を 1 つずつ追加する場合、すべてのデータを単純に置き換えているようです。ObservableCollection を再利用する代わりに、データ グリッドの itemssource を新しいアイテムを含む新しい ObservableCollection に設定できますか?

于 2010-08-10T14:09:22.060 に答える