一个DataSource用于多个控件

我在winforms应用程序中有两个ListBox ,我为它们分配了一个数据源,如下所示:

 private void MakeMeasurementUnits() { var units = new List { new MeasurementUnit {Name = "Current", SiUnit = "A"}, new MeasurementUnit {Name = "Voltage", SiUnit = "V"}, new MeasurementUnit {Name = "Time", SiUnit = "s"}, new MeasurementUnit {Name = "Temprature", SiUnit = "°C"} }; lbxXunit.DataSource = units; lbxYunit.DataSource = units; } 

奇怪的是(或者可能是因为这是我的第一次!!),在我点击其中一个lisboxes的项目的forms,第二个列表框中的相同项目也被选中。 这是默认行为吗? 怎么预防这个? 如果这是默认行为,那么有用的是什么?

我找到了快速补救措施来制作两个不同的数据源(与另一个名称相同)

列表框似乎缓存了绑定源。 这是默认行为。 如果要避免这种情况,最简单的方法是创建列表的副本以绑定到第二个数据源:

 lbxXunit.DataSource = units; lbxYunit.DataSource = units.ToList(); 

当您拥有相同数据的多个视图并希望同步这些项的选择时,这非常有用。

是的,这是正常行为。 这是因为ListView控件使用BindingSource对象来跟踪当前选定的项目。 (如果没有BindingSource,List无法跟踪所选项目。)

默认情况下,WinForms控件中的DataSource使用由WinForms系统本身为其创建的BindingSource。

您可以在以下url阅读有关BindingSource的更多信息: http : //msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx

这里有一篇文章可能也有帮助: http : //blogs.msdn.com/b/bethmassi/archive/2007/09/19/binding-multiple-comboboxes-to-the-same-datasource.aspx

您注意到的行为是winforms控件的默认/正确行为。 您可以通过为第二个列表框控件设置新的BindingContext而无需创建数据源副本来实现您的目标。

的BindingContext

这是正确的行为。 WindowsFormsdatasource管理会跟踪控件上的所选项目并操纵绑定数据。

您已经找到的分辨率:为这些控件分配2个不同的data sources objects