我有一个 ObservableCollection 以 MVVM 模式绑定到 WPFToolkit DataGrid。每隔 30 秒,我就有一个后台线程正在查询服务以获取某些数据。当它返回时,它会将其编组到 UI 线程并更新 ObservableCollection,方法是首先在集合上调用 Clear(),然后为每个项目调用 Add()。发生这种情况时,数据会正确更新到屏幕上,但是数据网格会闪烁。我怎样才能防止这种情况发生?
问问题
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);
}
}
}
当您处于编辑模式时,我的集合类可防止集合更改事件。在清除项目之前启动“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 秒。
问候,
简
于 2010-08-10T13:03:14.040 回答
1
如果您正在清除然后一次添加每个项目,那么您似乎只是在替换所有数据。您可以简单地将数据网格的 itemssource 设置为带有新项目的新 ObservableCollection,而不是重新使用您的 ObservableCollection?
于 2010-08-10T14:09:22.060 回答