【问题标题】:DataGrid and Cell-Level ComboBoxesDataGrid 和单元格级组合框
【发布时间】:2012-02-18 21:57:40
【问题描述】:

场景

ComboBox C 取决于 ComboBox B 的选定值,它取决于 ComboBox A 的选定值。所有这些 ComboBox 都在 DataGrid 中。

常见的路障:

  1. 用户必须能够添加新行(这需要具有无参数构造函数的 ItemsSource 项类型)。
  2. 要访问数据库以填充组合框的可用选项列表,当前项目需要将数据库凭据/DataContext 传递到构造函数中。

尝试 1

我尝试使用 3 个 CollectionViewSource,每个 ComboBoxes 一个 (Concept Code Here),但 ComboBox 的 SelectedItem 会在其他 DataGrid 行中自动选择。我需要找到一种方法将 CollectionViewSource 隔离到每一行。

我考虑过将 CollectionViewSource 数据添加到每个 DataGrid 项中,这样我就可以通过这种方式绑定到它,但是我必须访问数据库才能生成 CollectionViewSource。

我还尝试不共享 this question 中看到的 CollectionViewSource,但这破坏了 3 个组合框以及行之间的链接。如果我可以将 CollectionViewSources 设置为在每个 DataGrid Row 内共享,而不是在每个 DataGrid Row 之间共享,我认为它会起作用。我只是找不到这样做的方法。

尝试 2

我看过这个问题:How to get cell level ComboBox for WPF DataGrid?

这可行,但用户需要能够向 DataGrid 添加行。该问题中的示例代码也使用了无参数构造函数。我处于必须将访问数据库以填充列表的情况传递给构造函数。

问题

我该如何正确地做到这一点?

【问题讨论】:

    标签: wpf datagrid combobox


    【解决方案1】:

    绑定到ListObservableCollection,而不是CollectionViewSource

    CollectionViewSource 跟踪当前项,因此更改一个 ComboBox 中的值将更改所有 ComboBoxes 中的值

    【讨论】:

    • 我需要跟踪当前项目,以便知道用什么填充 ComboBoxes B 和 C。但是,我不希望它影响所有行。
    • ComboBox B 根据 A 中的 CurrentItem 进行填充,C 根据 B 的 CurrentItem 进行填充。
    • @Paxenos 应在您的数据对象中跟踪所选项目,而不是在您的集合中。例如,将ComboBoxA.SelectedItem 绑定到SelectedItemA,将ComboBoxB.SelectedItem 绑定到SelectedItemA.SelectedItemB,将ComboBoxC 绑定到SelectedItemA.SelectedItemB.SelectedItemC
    • 是否应该将用于填充组合框的集合也保留在数据对象中?
    • @Paxenos 不,这些项目似乎是静态的,应该存储在其他地方。通常在这种情况下,我将拥有一个包含所有 ComboBoxA 项目的静态列表,并且每个 ComboBoxA 项目都有其 ComboBoxB 项目的列表,依此类推。在绑定中,我将设置 ItemsSource 等于静态项目列表,并将 SelectedItem 设置为数据对象上的项目。数据对象上的项通常存储为键,例如整数,并公开一个返回StaticList.FirstOrDefault(p => p.key == DataItemKey)的公共属性
    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 2012-10-06
    • 2012-04-05
    • 2012-02-02
    • 2011-07-15
    • 2020-05-28
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多