WPF 数据表格下拉框数据绑定

3

有人能告诉我这段代码为什么有效吗?

<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}}}" />

第二个代码片段在编辑时没有显示供应商名称列表...
2个回答

5

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

在第一个示例中,由于您的 ComboBox 是可视树的一部分,RelativeSource 可以执行其应该执行的操作:沿着 UI 树向上查找您要求的项。但在第二个示例中,DataGridComboBoxColumn 是一个 DependencyObject,但它不是实际的 UI 元素 - 它是描述 UI 元素某些属性的对象。

您可以尝试使用 ElementName,并给您的根窗口命名。或者,您可能只需使用:

<DataGridComboBoxColumn ...
   ItemsSource="{Binding Path=Suppliers}" />
< p > DataContext 将从窗口流动到网格,所以除非您在 UI 中此时已经覆盖了它,否则它仍然可用。

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


发现 ElementName 似乎由于同样的原因而无法工作,而 Path=Suppliers 不起作用,因为 DataGrid 的 DataContext 已经与行集合绑定。最终采用了 DataTemplates,并使用 MultiBinding 和 Converter 在非编辑模式下显示名称。尽管如此,你关于它为什么不起作用的回答是正确的 :) - Stafford Williams

0
原因是 DataGridComboBoxColumn 的 ItemsSource 找不到。
您需要使用 RelativeSource 绑定,并将其指向正确的 DataContext AncestorType。这将需要一些尝试和错误来找到包含列表以满足 ItemsSource 的 DataContext。

问题中的第一个示例指示了应从哪里检索ItemsSource。您将如何通过DataGridComboBoxColumn.ItemsSource访问它? - Stafford Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接