背景:
自己在用listview添加数据的突然出现问题,直接蒙蔽了,因为自己用WPF不是很久。
找原因过程:
异常信息:
ItemsSource 正在使用时操作无效
说明是与ItemsSource有关。
我的代码:
void InitUI()
{
var AllRule = Service.GetAllRule();
if (AllRule != null && AllRule.Length > 0)
{
GroupRuleListView.ItemsSource = AllRule; //直接设置读取配置的数据源
}
}
添加数据的导致崩溃的地方:
if(RuleWindow.rule != null)
{
Service.AddRule(RuleWindow.rule);
GroupRuleListView.Items.Add(RuleWindow.rule);//添加就会崩溃
}
那么我直接不用数据源,我直接一个一个配置添加就可以解决问题。
void InitUI()
{
var AllRule = Service.GetAllRule();
if (AllRule != null && AllRule.Length > 0)
{
// GroupRuleListView.ItemsSource = AllRule; 不能这样子否者数据会有问题,用默认数据源
foreach(var item in AllRule)
{
GroupRuleListView.Items.Add(item);
}
}
}
本质问题:
我们通过F12查看代码(vs2019设置选项就可以查看源代码,见我以前的博客文章)。
对�0�2 GroupRuleListView.Items.Add(RuleWindow.rule);�0�2 add进行查看
看到代码:
//
// 摘要:
// Adds an item to the System.Windows.Controls.ItemCollection.
//
// 参数:
// newItem:
// The item to add to the collection.
//
// 返回结果:
// The zero-based index at which the object is added or -1 if the item cannot be
// added.
//
// 异常:
// T:System.InvalidOperationException:
// The item to add already has a different logical parent.
//
// T:System.InvalidOperationException:
// The collection is in ItemsSource mode.
public int Add(object newItem)
{
CheckIsUsingInnerView();
int result = _internalView.Add(newItem);
ModelParent.SetValue(ItemsControl.HasItemsPropertyKey, BooleanBoxes.TrueBox);
return result;
}
CheckIsUsingInnerView();�0�2关键代码
private void CheckIsUsingInnerView()
{
if (IsUsingItemsSource)
{
throw new InvalidOperationException(SR.Get(“ItemsSourceInUse”));
}
EnsureInternalView();
EnsureCollectionView();
VerifyRefreshNotDeferred();
}
这些代码来判断是否内部view,�0�2因为我们设置ItemSource ,那么就是用的外部,所以异常。
GroupRuleListView.Items.Add�0�2默认用的内部的,可以自己看代码分析。