为什么在分配给同一数据源时窗口小部件会同时更新?

时间:2012-03-09 15:33:13

标签: winforms

我有一个关于Windows窗体数据源的基本问题。

如果我将同一对象数据源分配到同一表单上的组合框和列表框中,我会观察到有趣的UI行为:当我更改组合框(或列表框)中的项目时,另一个控件选择相同的项目。

我没有针对此UI行为的额外代码,所以我想知道它是如何工作的。

 var persons = new List<Person>
                              {
                                  new Person {Id = 1, Age = 10, Name = "Alex"},
                                  new Person {Id = 2, Age = 12, Name = "Boris"},                                 
                              };

   //     ListBox 
   lbPersons.DisplayMember = "Name";           
   lbPersons.DataSource = persons;

    //    ComboBox
    cbPersons.DisplayMember = "Name";
    cbPersons.DataSource = persons; 

请解释一下控件的选定项目是如何同步更改的?

1 个答案:

答案 0 :(得分:1)

我在网上发现了一些类似的问题。我不完全明白这是如何运作的,但我会尽力说明:

当您将多个控件绑定到同一数据源时,它们使用相同的bindingcontext。因此,在一个控件上切换所选项目将更改另一个控件上的所选项目。

相反,当您绑定数据源时,请为每个数据源指定一个新的BindingContext:

lbPersons.DisplayMember = "Name";           
lbPersons.DataSource = persons;
lbPersons.BindingContext = new BindingContext();

cbPersons.DisplayMember = "Name";
cbPersons.DataSource = persons; 
cbPersons.BindingContext = new BindingContext();

我在一个论坛(下面的链接)中找到了这个信息,他们在那里确认了问题并找到了解决方案。我需要对此进行更多阅读,但可以在msdn中找到更多信息:

http://bytes.com/topic/c-sharp/answers/850851-multiple-controls-bound-same-data-source http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingcontext.aspx

编辑按照:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.bindingcontext(v=vs.71).aspx

  

Control的BindingContext对象用于返回单个对象   BindingManagerBase对象包含的所有数据绑定控件   控制。 BindingManagerBase对象保留所有控件   绑定到同一数据源同步。例如,设置   BindingManagerBase的Position属性指定了该项中的项   所有数据绑定控件指向的基础列表。

此外:

(http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingcontext.bindingcontext(V = vs.71)的.aspx)

  

例如,如果您有两个BindingManagerBase对象(来自两个)   不同的BindingContext对象),可以设置Position属性   每个BindingManagerBase到不同的值导致每组   数据绑定控件将显示来自相同数据的不同值   源。