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