我有一个关于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;
请解释一下控件的选定项目是如何同步更改的?
答案 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到不同的值导致每组 数据绑定控件将显示来自相同数据的不同值 源。