Почему происходит событие BindingSource.ListChanged при перемещении по элементам в базовом списке? - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь создать флаг «Модифицированный» или «Грязный» для текущей записи, если изменяется одно из полей. Я хочу использовать событие ListChanged источника привязки, чтобы установить грязный флаг. Это работает, если я изменяю содержимое текстового поля или выбираю другой объект в выпадающем списке.

Тем не менее, я заметил, что грязный флаг установлен (потому что событие ListChanged запускается) каждый раз, когда я перехожу к новой записи. Я получаю, что содержимое элементов управления меняется при переходе к новому элементу, но я думал, что событие ListChanged вызывается только с фактическими свойствами изменения списка, или элемент добавляется или удаляется.

Это Также интересно, что событие ListChanged вызывается, хотя мои классы не реализуют INotifyPropertyChange.

Вот мои настройки.

public partial class Form1 : Form
{
    BindingList<ClassA> records;
    BindingSource bs;
    public Form1()
    {
        InitializeComponent();
        records = new BindingList<ClassA>();
        records.Add(new ClassA(1, new ClassB(1, "Label1")));
        records.Add(new ClassA(2, new ClassB(2, "Label2")));

        bs = new BindingSource() { DataSource = records };
        bs.ListChanged += Bs_ListChanged;
        bs.PositionChanged += Bs_PositionChanged;


        List<ClassB> labels = new List<ClassB>();
        labels.Add(new ClassB(1, "Label1"));
        labels.Add(new ClassB(2, "Label2"));
        labels.Add(new ClassB(3, "Label3"));



        bindingNavigator1.BindingSource = bs;

        comboBox1.DataSource = labels;
        comboBox1.ValueMember = "ID";
        comboBox1.DisplayMember = "Label";

        textBox1.DataBindings.Add("Text", bs, "ID");
        comboBox1.DataBindings.Add("SelectedItem", bs, "Nested");
    }

    private void Bs_ListChanged(object sender, ListChangedEventArgs e)
    {
        label1.Text = "Changed"; // visual representation of the dirty flag
    }
}

А вот 2 класса.

class ClassA
{
    public int ID { get; set; }
    public ClassB Nested { get; set; }

    public ClassA (int id, ClassB b)
    {
        ID = id;
        Nested = b;
    }
}

class ClassB
{
    public int ID { get; set; }
    public string Label { get; set; }

    public ClassB (int id, string label)
    {
        ID = id;
        Label = label;
    }
}
...