C# 在项目中不更改InotifyProperty的情况下更新ObservableCollection项目

C# 在项目中不更改InotifyProperty的情况下更新ObservableCollection项目,c#,wpf,observablecollection,C#,Wpf,Observablecollection,我有一个可观察的收藏播放列表。此播放列表项显示在列表框中。 所有项目在一个特殊线程中更新其数据。我只需要在更新所有数据之后,列表框中的元素才会更新其信息。实际上,是否有一种方法可以通知项中的所有数据都已更改? 我有一个解决方案,但它看起来很糟糕,而且在某些情况下会导致错误 private void AsyncMIReady(MediaItem mediaItem) { if (PlayList.Contains(mediaItem)) { CurSynchronizat

我有一个可观察的收藏播放列表。此播放列表项显示在列表框中。 所有项目在一个特殊线程中更新其数据。我只需要在更新所有数据之后,列表框中的元素才会更新其信息。实际上,是否有一种方法可以通知项中的所有数据都已更改? 我有一个解决方案,但它看起来很糟糕,而且在某些情况下会导致错误

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);
}
我发现它很有用。它涉及对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));
  }
}
公共类RangeObservableCollection:ObservableCollection
{
私有bool_suppressNotification=false;
CollectionChanged上的受保护覆盖无效(NotifyCollectionChangedEventArgs e)
{
如果(!\u禁止通知)
基础。变更的集合(e);
}
public void AddRange(IEnumerable列表)
{
if(list==null)
抛出新的ArgumentNullException(“列表”);
_suppressNotification=true;
foreach(列表中的T项)
{
增加(项目);
}
_suppressNotification=false;
OnCollectionChanged(新建NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}

您可以编写
播放列表[i]=mediaItem而不是先删除然后插入项目。这将生成一个
CollectionChanged
事件,其中包含一个
Replace
操作,列表框将对该操作作出反应。使用List而不是ObserableCollection,并根据需要通知它。克莱门斯,我试过了,但不起作用。我现在不知道为什么。不幸的是,重置并重建列表框中的所有控件,这是一个非常繁重的过程。并且NotifyCollectionChangedAction尚未收到当前项的重置通知。