0

カレンダーを表すリストボックスを満たす 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));

すべて正常に動作します。ただし、データをクリアして新しいデータを追加するには、ビューでほぼ 1 秒かかります。これを最適化して、カレンダーにデータが表示されない時間を短縮できるかどうか疑問に思っています。

編集: これは実際のデバイス (Lumia 920) でのみ発生し、エミュレーターではそのような遅延はありません。

4

1 に答える 1

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
于 2013-11-14T18:45:19.297 に答える