ListBox.SelectedIndexChanged 第一次不触发

chm*_*ied 1 c# listbox selectedindexchanged winforms

我有一个绑定到 BindingList 的 ListBox,默认情况下该 ListBox 为空。
当选定的索引更改时,它应该使用选定对象中的数据更新其他控件。
问题是 SelectedIndexChanged 事件不会在第一个条目上触发(索引从 -1 更改为 0)。
但是,当我再次单击第一个条目(尽管在这种情况下索引没有改变)以及添加更多条目时,它确实会触发。
我检查了 myListBox.SelectedIndex 属性,它实际上从 -1 更改为 0,但由于某种原因没有调用事件处理程序。有谁知道为什么这样做以及如何解决它?

这是我的代码:

public partial class main : Form
{
    // The class of objects in my BindingList
    [Serializable]
    public class DisplayDefinition : INotifyPropertyChanged
    {
        private string _name;
        private int _width, _height, _posx, _posy;

        public string Name { get { return _name; } set { _name = value; NotifyPropertyChanged("Name"); } }
        public int Width { get { return _width; } set { _width = value; NotifyPropertyChanged("Width"); } }
        public int Height { get { return _height; } set { _height = value; NotifyPropertyChanged("Height"); } }

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string s)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(s));
        }
    }

    // Defining the BindingList 
    BindingList<DisplayDefinition> displaydefinitions = new BindingList<DisplayDefinition>();

    // Binding the list to my listbox 
    public main()
    {
        InitializeComponent();
        listDisplays.DataSource = displaydefinitions;
        listDisplays.DisplayMember = "Name";
    }

    // Button adding a new object to the list
    private void btnNewDisplay_Click(object sender, EventArgs e)
    {
        DisplayDefinition d = new DisplayDefinition();
        displaydefinitions.Add(d);
        listDisplays.SelectedItem = d;
    }

    private void listDisplays_SelectedIndexChanged(object sender, EventArgs e)
    {
        DisplayDefinition d = (DisplayDefinition)listDisplays.SelectedItem;
        // Do something with "d" ...
    }
}
Run Code Online (Sandbox Code Playgroud)

Ahm*_*eed 6

问题:

仅当将 与数据源一起使用时才会发生此行为ListBox,而在手动填充时不会发生ListBox

原因:

将第一个项目添加到数据源时,默认情况下会选择第一个项目,而不触发SelectedIndexChanged事件(不知道为什么!) ,这似乎是 中的一个错误ListBox,这使得设置SelectedItemSelectedIndex属性毫无用处。

解决方案(更像是解决方法)

您可以在设置实际/SelectedIndex之前将该属性更改为临时索引 (-1)以触发事件。SelectedIndexSelectedItemSelectedIndexChanged

像下面这样的东西应该有效:

// Button adding a new object to the list
private void btnNewDisplay_Click(object sender, EventArgs e)
{
    DisplayDefinition d = new DisplayDefinition();
    d.Name = "SomeName";
    displaydefinitions.Add(d);
    listDisplays.SelectedIndex = -1;
    listDisplays.SelectedItem = d;
}

private void listDisplays_SelectedIndexChanged(object sender, EventArgs e)
{
    if (listDisplays.SelectedIndex == -1) return;
    DisplayDefinition d = (DisplayDefinition)listDisplays.SelectedItem;
    // Do something with "d" ...
    Console.WriteLine(d.Name);
}
Run Code Online (Sandbox Code Playgroud)

希望有帮助:)