c # двустороннее связывание combobox и собственного класса не работает (иногда) - PullRequest
0 голосов
/ 13 февраля 2019

У меня проблема с привязкой свойств моего класса данных к свойствам элемента управления 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
}

Мой вопрос: почему он так себя ведет?

...