wpf ItemsSource 正在使用时操作无效 异常

背景:

自己在用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默认用的内部的,可以自己看代码分析。

Proxyfier 使用教程

Proxyfier 详细使用教程

背景

我们可能使用代理软件访问我们想要的资源,但有的软件可能默认不支持代理,或者你想统一把所有的软件都设置代理,那么我们用proxyier软件就可以了,他可以建立多个规则来满足你各种需求。

运行环境

windowxp ~ win10兼容

安装地址

自己百度一下,建议从大站的下载站,同时不要选择高速下载。

使用教程

1:安装(默认安装就可以,没有什么特别)

2:设置代理服务器(根据你的自己需求地址设置)
        比喻我的Shadowsocks地址:127.0.0.1

    设置proxifier的代理服务器
    添加时候,自己点击检查,看是否能够连上代理服务器,如果连不上,说明你代理服务器的配置有问题,自己排查即可。

**3: 设置规则(非常重要)**
    0:软件默认就带有一个规则,这个规则默认值,优先级是醉低的,所有他是放在最下面的,proxifier软件规则从上到下匹配,如果匹配到了就直接直接走这个规则。没有就下一个知道走到默认规则,

    1:新建规则(举例:建立远程桌面连接代理,默认不支持代理)
        我只要在应用程序里面添加 mstsc.exe即可(目标IP和端口根据自己需要设置),记得要动作要选择代理,

       保存规则

4:直接保存即可。


总结:
    1:新建代理服务器配置
    2:新建规则(一般设置需要代理的软件名字,记得加一下.exe)

    规则可以阻止别人联网,也可以设置直连,而可以代理。
    直连就是正常走你电脑流量,而不走代理。