以编程方式更改SelectedIndex时更改绑定的属性

时间:2012-03-10 19:02:48

标签: c# .net winforms visual-studio-2010

我已经设置了一个简单的表单。 ListBox从显示Name属性的“业务对象”中的列表中获取值,并提供Value属性。

此外,ListBox的SelectedItem属性绑定到同一业务对象中的属性。

使用UI从列表中正确选择值会更改objects属性(单击按钮时检查)并且可以使用正确的值。到目前为止一切都很好。

但是,如果在代码中更改了ListBox的SelectedIndex属性,则UI会按预期正确更改,但业务属性不会更改 - 它似乎错过了更改事件。对于构造函数和按钮事件处理程序中的设置都是如此(请参阅代码)。 我错过了什么或者我做错了什么。 (我只包括我编写的代码 - 而不是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 :(得分:0)

您不希望Click事件,您想要SelectedIndexChanged事件。无论用户或程序是否发起更改,都会触发此操作。