我需要跟踪列表框上的选定项,以便根据当前选定的值更新/禁用其他控件。
这是重现问题的代码:

public partial class Form1 : Form
{
    private readonly BindingList<string> List = new BindingList<string>();

    public Form1()
    {
        InitializeComponent();
        listBox1.DataSource = List;

        listBox1.SelectedValueChanged += (s, e) => System.Diagnostics.Debug.WriteLine("VALUE");
        listBox1.SelectedIndexChanged += (s, e) => System.Diagnostics.Debug.WriteLine("INDEX");

        addButton.Click += (s, e) => List.Add("Item " + (List.Count + 1));
        removeButton.Click += (s, e) => List.RemoveAt(List.Count - 1);

        logSelectionButton.Click += (s, e) =>
        {
            System.Diagnostics.Debug.WriteLine("Selected Index: " + listBox1.SelectedIndex);
            System.Diagnostics.Debug.WriteLine("Selected Value: " + listBox1.SelectedValue);
        };
    }
}

我的表单有一个列表框listBox1和三个按钮:addButtonremoveButtonlogSelectionButton
如果您再次按下addButton(从空列表开始),然后再次按下removeButton,最后再次按下addButton,则在最后一次按下SelectedValueChanged时,SelectedIndexChangedaddButton都不会触发,即使您在最后一次按下logSelectionButton之前和之后按下addButton,您将看到SelectedIndexSelectedValue的值分别从-1变为0和从null变为“项目1”,而“项目1”看起来是在列表框中选定的。
这将导致我需要根据所选项目更新的任何其他控件保持禁用状态,直到用户手动选择列表框中的项目为止,即使第一个项目已被选中。
我想不出任何解决办法。也许还订阅了bindingList的ListChanged事件以查看列表是否为空,但是我不知道列表框中的项在事件处理程序激发之前或之后是否会更新,这将导致其他问题。

最佳答案

似乎您在数据绑定时在ListControl内部处理PositionChanged事件时发现了一个错误(如果在vs中打开异常,则将第一个项添加到空列表时会看到一个异常)。
由于在数据绑定模式下ListControl派生类(如ListBoxComboBox等)会将其选择与PositionBindingManagerBase属性同步,因此可靠的解决方法(基本上是更通用的抽象解决方案)是处理底层数据源绑定管理器的CurrentChanged事件:

listBox1.BindingContext[List].CurrentChanged += (s, e) =>
    System.Diagnostics.Debug.WriteLine("CURRENT");

08-27 04:52