我在我的winforms应用程序中有两个ListBox
,我为它们分配了一个数据源,如下所示:
private void MakeMeasurementUnits()
{
var units = new List<MeasurementUnit>
{
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;
}
奇怪的是(或者可能是因为这是我第一次!!),在表单中,当我单击其中一个列表框中的项时,第二个列表框中的相同项也被选中了。这是默认行为吗?如何预防这种情况?如果这是默认行为,那么它有什么用呢?
我发现快速补救方法是制作两个不同的数据源(相同的事情与另一个名称)
列表框似乎缓存了绑定源。这是默认行为。如果您想避免这种情况,简单的方法是创建列表的副本以绑定到第二个数据源:
lbxXunit.DataSource = units;
lbxYunit.DataSource = units.ToList();
当您有相同数据的多个视图并希望同步这些项的选择时,这很有用。
是的,这是正常的行为。这是因为ListView控件使用BindingSource对象来跟踪当前选中的项。(如果没有BindingSource, List就无法跟踪选中的项。)
默认情况下,WinForms控件中的数据源使用WinForms系统自己为它创建的BindingSource。
你可以阅读更多关于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
这是正确的行为。WindowsForms
中的datasource
管理跟踪控件上的选定项并操纵绑定数据。
您已经找到的解决方案:是为这些控件分配2个不同的data sources objects
。