Изменить привязанное свойство при программном изменении SelectedIndex - PullRequest
0 голосов
/ 10 марта 2012

Я настроил простую форму.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;
    }
}

1 Ответ

0 голосов
/ 10 марта 2012

Вам не нужно событие Click, вам нужно событие SelectedIndexChanged.Это сработает независимо от того, инициирует ли изменение пользователь или программа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...