优化将数据分配给ObservableCollection

时间:2013-11-14 18:21:30

标签: c# windows-phone

我有一个ObservableCollection填充表示日历的列表框。

private ObservableCollection<DateItem> _DateList = new ObservableCollection<DateItem>();
public ObservableCollection<DateItem> DateList { get { return _DateList; } }

当用户请求下个月我从一个单独的类中获取已经解析的月份并将它们分配给我的ObservableCollection,如下所示:

// clear DateList first
DateList.Clear();
// set month
foreach (DateItem item in parsemonth.GetNextMonth())
    Dispatcher.BeginInvoke(() => DateList.Add(item));

一切正常。但是清理数据并添加新数据需要几秒钟的时间。我想知道这是否可以优化,这样我就可以缩短日历中没有数据的时间。

编辑:这只发生在实际设备上(Lumia 920),仿真器上没有这样的延迟。

1 个答案:

答案 0 :(得分:0)

如果你有一个大集合,问题可能是你要为每个添加的项目发送一个事件。由于您始终清除集合,因此可以创建一个ObservableCollection版本,在添加项目时禁用更新:

/// <summary>
/// An observable collection that supports batch changes without sending CollectionChanged
/// notifications for each individual modification
/// </summary>
public class ObservableCollectionEx<T> : ObservableCollection<T>
{
    /// <summary>
    /// While true, CollectionChanged notifications will not be sent.
    /// When set to false, a NotifyCollectionChangedAction.Reset will be sent.
    /// </summary>
    public bool IsBatchModeActive
    {
        get { return _isBatchModeActive; }
        set
        {
            _isBatchModeActive = value;

            if (_isBatchModeActive == false)
            {
                OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
            }
        }
    }
    private bool _isBatchModeActive;

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        if (!IsBatchModeActive)
        {
            base.OnCollectionChanged(e);
        }
    }
}

用法:

DateList.IsBatchModeActive = true;  // Disables collection change events
DateList.Clear();

foreach (DateItem item in parsemonth.GetNextMonth())
    DateList.Add(item);

DateList.IsBatchModeActive = false;  // Sends a collection changed event of Reset and re-enables collection changed events