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尚未收到当前项的重置通知。