PropertyGrid --> BindingList --> 将项目添加到列表时的奇怪行为
PropertyGrid --> BindingList --> Strange behavior when adding items to the list
我注意到 PropertyGrid 与 BindingList 结合使用时有一种奇怪的行为。
当向 BindingList 添加项目时,PropertyGrid 首先清除 BindingList 中的所有项目,然后再将所有先前的项目一一添加,然后才将新项目添加到其中。
我的问题是,它每次都会引发 'ListChanged' 事件,但我只想为每个添加的项目触发一次,而不是例如在添加第二个项目时触发 3 次。
这是一个例子:
private void Form1_Load(object sender, EventArgs e)
{
propertyGrid1.SelectedObject = new Foo();
}
private class Foo
{
[DisplayName("BindingList")]
[Description("BindingList")]
[Category("BindingList")]
[Browsable(true)]
public BindingList<int> Bar { get; set; } = new BindingList<int>();
public int BindingListEventRaiseCount { get; set; } = 0;
public Foo(){
Bar.ListChanged += OnBinListChanged;
}
private void OnBinListChanged(object sender, EventArgs e){
BindingListEventRaiseCount++;
Console.WriteLine("Current ListElementsCount: " + ((BindingList<int>)sender).Count);
}
}
通过 propertyGrid 控件添加 3 个项目时的输出:
Current ListElementsCount: 0
Current ListElementsCount: 1
Current ListElementsCount: 0
Current ListElementsCount: 1
Current ListElementsCount: 2
Current ListElementsCount: 0
Current ListElementsCount: 1
Current ListElementsCount: 2
Current ListElementsCount: 3
是否修复了此错误?
我不知道这是否有帮助,但在再次创建项目之前总是有一个 Reset
。
按确定时,也会执行重置。
private void OnBinListChanged(object sender, ListChangedEventArgs e)
{
switch (e.ListChangedType)
{
case ListChangedType.ItemAdded:
BindingListEventRaiseCount++;
Console.WriteLine("Current ListElementsCount: " + ((BindingList<int>)sender).Count);
break;
case ListChangedType.Reset:
Console.WriteLine("Reset");
break;
}
}
输出(4 项):
Reset
Current ListElementsCount: 1
Reset
Current ListElementsCount: 1
Current ListElementsCount: 2
Reset
Current ListElementsCount: 1
Current ListElementsCount: 2
Current ListElementsCount: 3
Reset
Current ListElementsCount: 1
Current ListElementsCount: 2
Current ListElementsCount: 3
Current ListElementsCount: 4
Reset
Current ListElementsCount: 1
Current ListElementsCount: 2
Current ListElementsCount: 3
Current ListElementsCount: 4
我注意到 PropertyGrid 与 BindingList 结合使用时有一种奇怪的行为。
当向 BindingList 添加项目时,PropertyGrid 首先清除 BindingList 中的所有项目,然后再将所有先前的项目一一添加,然后才将新项目添加到其中。
我的问题是,它每次都会引发 'ListChanged' 事件,但我只想为每个添加的项目触发一次,而不是例如在添加第二个项目时触发 3 次。
这是一个例子:
private void Form1_Load(object sender, EventArgs e)
{
propertyGrid1.SelectedObject = new Foo();
}
private class Foo
{
[DisplayName("BindingList")]
[Description("BindingList")]
[Category("BindingList")]
[Browsable(true)]
public BindingList<int> Bar { get; set; } = new BindingList<int>();
public int BindingListEventRaiseCount { get; set; } = 0;
public Foo(){
Bar.ListChanged += OnBinListChanged;
}
private void OnBinListChanged(object sender, EventArgs e){
BindingListEventRaiseCount++;
Console.WriteLine("Current ListElementsCount: " + ((BindingList<int>)sender).Count);
}
}
通过 propertyGrid 控件添加 3 个项目时的输出:
Current ListElementsCount: 0
Current ListElementsCount: 1
Current ListElementsCount: 0
Current ListElementsCount: 1
Current ListElementsCount: 2
Current ListElementsCount: 0
Current ListElementsCount: 1
Current ListElementsCount: 2
Current ListElementsCount: 3
是否修复了此错误?
我不知道这是否有帮助,但在再次创建项目之前总是有一个 Reset
。
按确定时,也会执行重置。
private void OnBinListChanged(object sender, ListChangedEventArgs e)
{
switch (e.ListChangedType)
{
case ListChangedType.ItemAdded:
BindingListEventRaiseCount++;
Console.WriteLine("Current ListElementsCount: " + ((BindingList<int>)sender).Count);
break;
case ListChangedType.Reset:
Console.WriteLine("Reset");
break;
}
}
输出(4 项):
Reset
Current ListElementsCount: 1
Reset
Current ListElementsCount: 1
Current ListElementsCount: 2
Reset
Current ListElementsCount: 1
Current ListElementsCount: 2
Current ListElementsCount: 3
Reset
Current ListElementsCount: 1
Current ListElementsCount: 2
Current ListElementsCount: 3
Current ListElementsCount: 4
Reset
Current ListElementsCount: 1
Current ListElementsCount: 2
Current ListElementsCount: 3
Current ListElementsCount: 4