0

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

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

1 回答 1

0

我发现很有用。它涉及对 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));
  }
}
于 2013-02-12T14:25:47.020 回答