У меня проблема с привязкой свойств моего класса данных к свойствам элемента управления ComboBox.
Чтобы показать вам мою проблему, я создал новый проект WinFrom с ComboBox (comboBox1) в стиле DropDownList и двумя кнопками.(кнопка1 и кнопка2).Чтобы связать данные, я следовал советам из этих постов:
Свойство связывания для управления в Winforms
Двустороннее связывание данных в winforms, Inotifypropertyolated реализовано в базовом классе
Теперь мой класс данных выглядит следующим образом:
public class Data : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
// --- Properties ---
// - value -
public object value { get; set; }
// - abc -
private string _abc;
public string abc
{
get { return _abc; }
set
{
if (value != _abc)
{
_abc = value;
NotifyPropertyChanged();
}
}
}
}
... и другая часть кода:
Data MyDataSource = new Data();
public Form1()
{
InitializeComponent();
comboBox1.Items.AddRange(new string[] { "a", "b", "c" });
comboBox1.DataBindings.Add(new Binding(nameof(comboBox1.Tag), MyDataSource, nameof(MyDataSource.value)));
comboBox1.DataBindings.Add(new Binding(nameof(comboBox1.SelectedItem), MyDataSource, nameof(MyDataSource.abc)));
}
private void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("Value of _abc = " + MyDataSource.abc + " / comboBox1.SelectedItem = " + comboBox1.SelectedItem.ToString());
}
private void button2_Click(object sender, EventArgs e)
{
MyDataSource.abc = "a";
}
Вы можете выбратьзначение с помощью comboBox1 (a, b или c).После нажатия кнопки1 вы можете увидеть, например:
Value of _abc = b / comboBox1.SelectedItem = b
Все хорошо.Если вы нажмете кнопку 2, значение a
будет записано в MyDataSource.abc
, и comboBox1 также обновится.Результат нажатия кнопки 1 выглядит следующим образом:
Value of _abc = a / comboBox1.SelectedItem = a
Но теперь проблема в том, что вы не можете изменить значение обратно на другое с помощью comboBox1.Если вы попытаетесь изменить его в раскрывающемся меню и оставить выделенный ComboBox, значение вернется к a
.
. Чтобы решить эту проблему, вы можете сделать следующее:
Data MyDataSource = new Data();
public Form1()
{
InitializeComponent();
comboBox1.Items.AddRange(new string[] { "a", "b", "c" });
//comboBox1.DataBindings.Add(new Binding(nameof(comboBox1.Tag), MyDataSource, nameof(MyDataSource.value)));
comboBox1.DataBindings.Add(new Binding(nameof(comboBox1.SelectedItem), MyDataSource, nameof(MyDataSource.abc)));
}
или
Data MyDataSource = new Data();
public Form1()
{
InitializeComponent();
comboBox1.Items.AddRange(new string[] { "a", "b", "c" });
comboBox1.DataBindings.Add(new Binding(nameof(comboBox1.SelectedItem), MyDataSource, nameof(MyDataSource.abc)));
comboBox1.DataBindings.Add(new Binding(nameof(comboBox1.Tag), MyDataSource, nameof(MyDataSource.value))); // now after the SelectedItem Binding
}
Мой вопрос: почему он так себя ведет?