我正在研究ObservableCollection的Refresh()扩展方法,该方法基于匹配键添加,删除或替换项目(这意味着当绑定到DataGrid时,网格不会重新滚动并且项目不会更改除非将其移除,否则它们的位置).
I'm working on a Refresh() extension method for ObservableCollection which adds, removes or replaces items based on a matching key (this means when bound to a DataGrid the grid doesn't re-scroll and items don't change their position unless they were removed).
问题是当我替换ObservableCollection中的项目时,最后一个项目引发ArgumentOutOfRangeException,我在这里缺少什么?
Problem is when I replace items in the ObservableCollection the last item throws an ArgumentOutOfRangeException, what am I missing here?
public static void Refresh<TItem, TKey>(this ObservableCollection<TItem> target, IEnumerable<TItem> source, Func<TItem, TKey> keySelector) { var sourceDictionary = source.ToDictionary(keySelector); var targetDictionary = target.ToDictionary(keySelector); var newItems = sourceDictionary.Keys.Except(targetDictionary.Keys).Select(k => sourceDictionary[k]).ToList(); var removedItems = targetDictionary.Keys.Except(sourceDictionary.Keys).Select(k => targetDictionary[k]).ToList(); var updatedItems = (from eachKey in targetDictionary.Keys.Intersect(sourceDictionary.Keys) select new { Old = targetDictionary[eachKey], New = sourceDictionary[eachKey] }).ToList(); foreach (var updatedItem in updatedItems) { int index = target.IndexOf(updatedItem.Old); target[index] = updatedItem.New; // ArgumentOutOfRangeException is thrown here } foreach (var removedItem in removedItems) { target.Remove(removedItem); } foreach (var newItem in newItems) { target.Add(newItem); } }推荐答案
您对新旧事物的理解不正确.这个:
You've got Old and New the wrong way round. This:
var updatedItems = (from eachKey in targetDictionary.Keys .Intersect(sourceDictionary.Keys) select new { Old = targetDictionary[eachKey], New = sourceDictionary[eachKey] }).ToList();应该是这样:
var updatedItems = (from eachKey in targetDictionary.Keys .Intersect(sourceDictionary.Keys) select new { New = targetDictionary[eachKey], Old = sourceDictionary[eachKey] }).ToList();当前,您正在寻找 new 值的索引,该索引将为-1 ...
Currently you're looking for the index of the new value, which will be -1...
更多推荐
替换ObservableCollection< T>中的项目时ArgumentOutOfRangeException
发布评论