Я пытаюсь создать флаг «Модифицированный» или «Грязный» для текущей записи, если изменяется одно из полей. Я хочу использовать событие 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;
}
}