【问题标题】:WPF Datagrid ComboBox DataBindingWPF Datagrid ComboBox 数据绑定
【发布时间】:2011-05-06 10:09:06
【问题描述】:

谁能告诉我为什么会这样?

<DataGridTemplateColumn Header="Supplier">
  <DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
          <ComboBox DisplayMemberPath="SupplierName" SelectedValuePath="SupplierID" 
                    SelectedValue="{Binding SupplierID}"
                    ItemsSource="{Binding Path=DataContext.Suppliers, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
      </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>

但事实并非如此;

<DataGridComboBoxColumn Header="Combo" DisplayMemberPath="SupplierName" SelectedValuePath="SupplierID" 
  SelectedValueBinding="{Binding SupplierID}"
  ItemsSource="{Binding Path=DataContext.Suppliers, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />

第二个 sn-p 在编辑时不显示 SupplierName 的列表...

【问题讨论】:

    标签: wpf data-binding datagrid datagridcomboboxcolumn


    【解决方案1】:

    这是因为 DataGridComboBoxColumn 不是用户界面元素,但 ComboBox 是。

    在第一个示例中,因为您的ComboBox 是可视化树的一部分,RelativeSource 可以做它应该做的事情:沿着 UI 树查找您要求的项目。但在第二个示例中,DataGridComboBoxColumnDependencyObject,但它不是实际的 UI 元素 - 它是描述有关 UI 元素的某些内容的对象。

    您可以尝试改用ElementName,并为您的根窗口命名。或者,您也许可以侥幸逃脱:

    <DataGridComboBoxColumn ...
       ItemsSource="{Binding Path=Suppliers}" />
    

    DataContext 将从窗口向下流向网格,因此除非您此时在 UI 中用其他内容覆盖它,否则它仍然可用。

    或者,如果这不起作用,您可能希望将相关集合添加到资源字典中,以便您可以在绑定中使用 Source={StaticResource suppliers} 获取它。

    【讨论】:

    • 发现 ElementName 似乎出于同样的原因不起作用,并且 Path=Suppliers 不起作用,因为 DataGrid 的 DataContext 已经绑定到行集合。最终使用 DataTemplates 并使用 MultiBinding & a Converter 在非编辑模式下显示名称。尽管如此,你回答为什么它不起作用是正确的:)
    【解决方案2】:

    原因是找不到DataGridComboBoxColumn的ItemsSource。

    您将需要使用RelativeSource 绑定并将其指向正确的DataContext AncestorType。这需要反复试验才能找到包含您的列表以满足您的 ItemsSource 的 DataContext。

    【讨论】:

    • 问题中的第一个示例指示应从何处检索 ItemsSource。您将如何通过 DataGridComboBoxColumn.ItemsSource 访问它?
    猜你喜欢
    • 2016-04-30
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2019-04-15
    • 2012-08-17
    • 2011-06-15
    相关资源
    最近更新 更多