Поле со списком Windows Forms - привязка данных к нескольким свойствам - PullRequest
4 голосов
/ 18 мая 2011

У меня проблемы с привязкой данных к свойствам SelectedValue и Text в Combobox. Вот соответствующий фрагмент кода:

DataTable dt1 = DataAccess.GetLoanPurposes();
ddLoanPurpose.DisplayMember = "Name";
ddLoanPurpose.ValueMember = "Value";
ddLoanPurpose.DataBindings.Add("Text", _scenario, "LoanPurposeString", false);
ddLoanPurpose.DataBindings.Add("SelectedValue", _scenario, "LoanPurpose", false);            
ddLoanPurpose.DataSource = dt1;

Я могу привязать либо к Text , либо к SelectedValue, и все работает великолепно. Проблема возникает, когда я пытаюсь связать оба . Работает только первая привязка данных (Text to LoanPurposeString в приведенном выше примере). Если я переключу порядок привязки данных ...

ddLoanPurpose.DataBindings.Add("SelectedValue", _scenario, "LoanPurpose", false);
ddLoanPurpose.DataBindings.Add("Text", _scenario, "LoanPurposeString", false);

... тогда я теряю привязку Text к LoanPurposeString, но теперь SelectedValue привязывается к LoanPurpose. Поэтому мой вопрос состоит из двух частей: почему обе привязки не связываются с моим объектом _scenario и почему порядок имеет значение?

1 Ответ

3 голосов
/ 20 мая 2011

Привязка данных к двум различным свойствам не поддерживается (по крайней мере, не на основании моих исследований).В этом конкретном случае наилучшим решением является объединение отдельных свойств в моем объекте _scenario (LoanPurpose и LoanPurposeString) в одно свойство KeyValuePair.

public KeyValuePair<string, string> LoanPurpose { get; set; }

Мне просто нужно убедиться, что переменная ValueMember вDataSource является KeyValuePair.Так что-то вроде ...

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Name", typeof(string)));
dt.Columns.Add(new DataColumn("Value", typeof(KeyValuePair<string, string>)));
DataRow dRow = dt.NewRow();
dRow["Name"] = "Eric";
dRow["Value"] = new KeyValuePair<string, string>("1", "Eric");
dt.Rows.Add(dRow);

Синтаксис привязки будет таким же, как в моем исходном вопросе, единственное отличие состоит в том, что ValueMember теперь является объектом KeyValuePair вместо строки.

ddLoanPurpose.DisplayMember = "Name";
ddLoanPurpose.ValueMember = "Value";
ddLoanPurpose.DataSource = dt;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...