Я настроил простую форму.ListBox получает значения из списка в «бизнес-объекте», отображая свойство Name и предоставляя свойство Value.
Кроме того, свойство SelectedItem объекта ListBox связывается со свойством в том же бизнес-объекте.
Использование пользовательского интерфейса для выбора значения из списка корректно изменяет свойство объектов (проверяется при нажатии кнопки) и становится доступным правильное значение.Пока все хорошо.
Однако, если свойство SelectedIndex ListBox изменяется в коде, то пользовательский интерфейс корректно изменяется, как и ожидалось, но бизнес-свойство не изменяется - кажется, что пропущено событие изменения.Это верно как для установки в конструкторе, так и в обработчике события кнопки (см. Код).Что я пропустил или что я делаю неправильно.(Я включил только код, который я написал, а не VS сгенерированный мастером материал)
class Frequency
{
public String Name { get; set; }
public Int16 Value { get; set; }
public Frequency(String name, Int16 value)
{
Name = name;
Value = value;
}
}
class FrequencyList : System.ComponentModel.BindingList<Frequency>
{
}
class Model
{
public static FrequencyList FrequencyValues = new FrequencyList()
{
new Frequency("Slowest", 100),
new Frequency("Slow", 150),
new Frequency("Medium", 1000),
new Frequency("Fast", 5500),
new Frequency("Fastest", 10000)
};
public Frequency StartFrequency { get; set; }
public void DoStuff()
{
if (StartFrequency == null)
return;
Int16 freq = StartFrequency.Value;
}
}
public partial class Form1 : Form
{
private Model myModel = new Model();
public Form1()
{
InitializeComponent();
// Bind the list to a copy of the static model data
this.listBox1.DataSource = Model.FrequencyValues;
// Bind the control to the model value
this.listBox1.DataBindings.Add("SelectedItem", myModel, "StartFrequency");
// Select the start value
this.listBox1.SelectedIndex = 3;
}
private void button1_Click(object sender, EventArgs e)
{
Int16 f = (Int16)listBox1.SelectedValue;
this.myModel.DoStuff();
int new_index = listBox1.SelectedIndex + 1;
if (new_index >= listBox1.Items.Count)
new_index = 0;
listBox1.SelectedIndex = new_index;
}
}