2

我有一个 ObservableCollection 以 MVVM 模式绑定到 WPFToolkit DataGrid。每隔 30 秒,我就有一个后台线程正在查询服务以获取某些数据。当它返回时,它会将其编组到 UI 线程并更新 ObservableCollection,方法是首先在集合上调用 Clear(),然后为每个项目调用 Add()。发生这种情况时,数据会正确更新到屏幕上,但是数据网格会闪烁。我怎样才能防止这种情况发生?

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);
        }
    }
}

当您处于编辑模式时,我的集合类可防止集合更改事件。在清除项目之前启动“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 回答