2012-03-10 203 views
0

我已经设置了一个简单的表单。 ListBox从显示Name属性的“业务对象”中的列表中获取值,并提供Value属性。以编程方式更改SelectedIndex时更改绑定属性

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

使用UI从列表中选择一个值可正确更改对象属性(单击按钮时选中)并且正确的值可用。到现在为止还挺好。

但是,如果在代码中更改了列表框的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; 
    } 
} 

回答

0

你不想Click事件,你想要的SelectedIndexChanged事件。无论用户还是程序发起更改,这都会触发。

+0

对不起,转向不好。点击事件仅用于测试。我可以强制使用SelectedIndexChanged事件更新业务对象 - 但这不是我想要做的。如果StartFrequency属性正在通过UI更改进行更新,那么为什么在程序中设置了SelectedIndex时不会更新它? – 2012-03-10 19:27:49

+0

@ Gray-M不,我的意思是你需要在'listBox1_SelectedIndexChanged'中有'freq.value = Convert.ToInt16(listBox1 [listBox1.SelectedIndex] .Text)'并且确保你已经将它链接到了控件上。或者通过在属性工具栏中自动生成,或者手动添加'this.listBox1.SelectedIndexChanged + = new System.EventHandler(this.listBox1_SelectedIndexChanged);'在表单初始化的某处。然后你可以通过使用'listBox1.SelectedIndex = 3'或者其他任何东西来自动触发它。 – ketura 2012-03-10 19:41:43

+0

好吧,这确实有用,但不需要从表单到对象的数据绑定。事件处理程序完成了这一切。我试图让绑定完成这一切。 – 2012-03-11 10:20:24

相关问题