一个数据源用于多个控件



我在我的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

最新更新