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