我在集合数据以及为集合中的项目设置 GroupNames 时遇到了非常相似的问题(我想允许空组,所以我手动更新 PropertyGroupDescriptor.GroupNames)。
事实证明,当添加到 ObservableCollection 时,您会在添加的每一行上触发 CollectionChanged 事件,如果您更改组,您将更新组和每个组的行。
解决方案是在集合上使用 AddRange,遗憾的是它不存在,并且您不能从包含组名的 ObservableCollection 继承,因为它来自保存数据的集合的 PropertyGroupDescriptor ...但是...使用反射可以在底层项目中获得最杂乱的杂物。
所以,我提出我非常讨厌的 GroupNames 更新代码:-
public void CheckGroups(ObservableCollection<Object> GroupNames) {
var lBindingFlags = BindingFlags.NonPublic | BindingFlags.Instance;
if (mHasUpdates) {
var lHashC = new HashSet<Object>(GroupNames);
var lHashN = new HashSet<Object>(mGroupList);
var lAdd = lHashN.Except(lHashC).ToList();
var lRemove = lHashC.Except(lHashN).ToList();
if (lAdd.Count > 0 || lRemove.Count > 0) {
var lType = GroupNames.GetType();
var lProp = lType.GetProperty("Items", lBindingFlags);
var lItems = (List<Object>)lProp.GetValue(GroupNames, null);
var lMethod = lType.GetMethod("OnCollectionChanged", lBindingFlags, null, new Type[] { typeof(NotifyCollectionChangedEventArgs) }, null);
var lArgs = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
if (lAdd.Count > 0) lItems.AddRange(lAdd);
if (lRemove.Count > 0) lItems.RemoveAll(R => lRemove.Contains(R));
lMethod.Invoke(GroupNames, new Object[] { lArgs });
}
}
}