【问题标题】:Binding a ComboBox to two sources将 ComboBox 绑定到两个源
【发布时间】:2013-10-21 15:49:28
【问题描述】:

所以我有一个List<T>,我通过BindingSource 将我的ComboBox 绑定到。工作正常,没问题。现在我需要向我的ComboBox 添加一个列表中不可用的项目(我也无法修改列表的内容)。我想到了以下方案:

  1. 创建原始列表的副本,并在绑定之前再添加一项。
  2. 通过 LINQ 创建两个列表的 UNION(第二个只有一个项目),然后让我的 BindingSource 监视聚合列表。
  3. 手动将项目添加到 ComboBox,然后监视列表的更改。

现在我不想选择第三个选项并失去绑定优势。第一个选项不起作用,因为新创建的列表未链接到原始列表,因此不会更新。我猜通过 LINQ 组合两个列表也会创建一个独立的列表。

所以我在这里寻找的是我称之为 AggregateBindingSource 的东西,它将一个或多个 List<T>s 作为其数据源并自动更新我的 ComboBox。

或者有人有更好的主意吗?

【问题讨论】:

    标签: .net winforms binding combobox bindingsource


    【解决方案1】:

    我会在自己的类(ViewModel)中创建一个新列表,该类由您的列表 + 单个项目组成。 并将这个新列表数据绑定到您的 ComboBox。

    1. 如果您正在使用引用,在 ViewModel 中更新您的 List 将自动更新您的其他 List + Item 中的条目。

    2. 如果您不使用参考,则必须更新您的列表 + 项目。您可以在 ViewModel 中使用更新功能。但即使你只使用一个整数,例如我会将它放在一个对象中,这样你就可以使用引用,然后你可以再次使用第 1 步。

    因此,如果您使用您在帖子中描述的前两个步骤之一并注意参考,则创建新列表没有问题。

    【讨论】:

    • 从现有列表创建新列表(例如使用构造函数)不会以任何方式将新列表链接到旧列表。它只创建原始列表的浅表副本(即使使用引用)。原列表的任何更改都不会影响新列表的内容。
    • ofc 它们并没有真正链接,但是如果您在两个列表中存储相同的引用,那么它们会访问相同的元素。因此,如果您删除或插入一个列表,则必须更新。但是,如果您只是更改元素的某些成员,它们将在两个列表中更新。
    • 正确,但是您只是在建议没有案例。 3 我在上面贴了,我想避免,因为列表会经历很多插入/删除操作,所以绑定真的很方便。
    • 我真的不知道将两个源绑定到一个组合框的解决方案。您能否提供一些代码来澄清您的问题,因为我真的不明白为什么您不能将列表 + 项目组合到视图模型列表中。并在修改列表后将其保存回您的第一个列表+项目。也许一些 sn-ps 将有助于解决问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2012-06-22
    相关资源
    最近更新 更多