gpt4 book ai didi

c# - 从另一个集合更新 ObservableCollection

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:31 25 4
gpt4 key购买 nike

我将 ObservableCollection 绑定(bind)到 WPF ListView。该列表中的数据来自 REST 服务。所以我从 REST 服务获取数据并将其放入绑定(bind)的 ObservableCollection 中。我定期调用 REST 服务来检查更新的数据,这意味着可以删除、添加数据或更改项目的顺序。我如何将这些更改反射(reflect)到 ObservableCollection 中?我不想每次从 REST 服务获取更新数据时都完全替换 ObservableCollection。如果仅针对源数据中更改的条目更改 ObservableCollection,这将更加用户友好。因此,当在源数据中添加一个项目时,我想将此项目添加到 ObservableCollection 中与源数据(REST 服务)中完全相同的位置。删除的项目和重新排序的项目相同。所以我只想更新更改的项目而不是整个集合。这可能吗?

最佳答案

更新:因为似乎没有标准方法可以做到这一点,所以我尝试自己实现一个解决方案。这绝对不是生产代码,我可能已经忘记了很多用例,但也许这是一个开始?这是我想出的:

public class ObservableCollectionEx<T> : ObservableCollection<T>
{
public void RecreateCollection( IList<T> newList )
{
// nothing changed => do nothing
if( this.IsEqualToCollection( newList ) ) return;

// handle deleted items
IList<T> deletedItems = this.GetDeletedItems( newList );
if( deletedItems.Count > 0 )
{
foreach( T deletedItem in deletedItems )
{
this.Remove( deletedItem );
}
}

// handle added items
IList<T> addedItems = this.GetAddedItems( newList );
if( addedItems.Count > 0 )
{
foreach( T addedItem in addedItems )
{
this.Add( addedItem );
}
}

// equals now? => return
if( this.IsEqualToCollection( newList ) ) return;

// resort entries
for( int index = 0; index < newList.Count; index++ )
{
T item = newList[index];
int indexOfItem = this.IndexOf( item );
if( indexOfItem != index ) this.Move( indexOfItem, index );
}
}

private IList<T> GetAddedItems( IEnumerable<T> newList )
{
IList<T> addedItems = new List<T>();
foreach( T item in newList )
{
if( !this.ContainsItem( item ) ) addedItems.Add( item );
}
return addedItems;
}

private IList<T> GetDeletedItems( IEnumerable<T> newList )
{
IList<T> deletedItems = new List<T>();
foreach( var item in this.Items )
{
if( !newList.Contains( item ) ) deletedItems.Add( item );
}
return deletedItems;
}

private bool IsEqualToCollection( IList<T> newList )
{
// diffent number of items => collection differs
if( this.Items.Count != newList.Count ) return false;

for( int i = 0; i < this.Items.Count; i++ )
{
if( !this.Items[i].Equals( newList[i] ) ) return false;
}
return true;
}

private bool ContainsItem( object value )
{
foreach( var item in this.Items )
{
if( value.Equals( item ) ) return true;
}
return false;
}
}

方法“RecreateCollection”是调用以将更新列表从数据源 (newList)“同步”到现有 ObservableCollection 中的方法。我确定求助是错误的,所以也许有人可以帮助我解决这个问题?另外值得一提的是:Collections 中的 Items 必须覆盖 EqualsTo 以便按内容而不是按引用比较对象。

关于c# - 从另一个集合更新 ObservableCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19558644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com