更新项目中没有INotifyPropertyChanged的ObservableCollection项目

时间:2013-02-12 14:17:18

标签: c# wpf observablecollection

我有ObservableCollection播放列表。此播放列表项目显示在列表框中。 所有项目都在特殊线程中更新其数据。我需要在更新所有数据后,listbox中的元素更新其信息。实际上有没有办法通知项目中的所有数据都发生了变化? 我有一个解决方案,但它看起来很糟糕,而且在某些情况下会导致错误。

private void AsyncMIReady(MediaItem mediaItem)
{
   if (PlayList.Contains(mediaItem))
   {
       CurSynchronizationContext.Post(delegate(object someState)
             {
                 UpdateItemInPlayList(mediaItem);
             }
                 , null);
    }
 }

public void UpdateItemInPlayList(MediaItem mediaItem)
{
    int i = PlayList.IndexOf(mediaItem);
    PlayList.RemoveAt(i);
    PlayList.Insert(i, mediaItem);
}

1 个答案:

答案 0 :(得分:0)

我发现this很有用。它涉及对ObservableCollection进行子类化并在AddRange上暂停通知。

public class RangeObservableCollection<T> : ObservableCollection<T>
{
  private bool _suppressNotification = false;

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

  public void AddRange(IEnumerable<T> list)
  {
    if (list == null)
      throw new ArgumentNullException("list");

    _suppressNotification = true;

    foreach (T item in list)
    {
      Add(item);
    }
    _suppressNotification = false;
    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
  }
}