我有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);
}
答案 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));
}
}