WPF Datagrid ComboBox DataBinding

时间:2010-11-07 22:22:44

标签: wpf data-binding datagrid datagridcomboboxcolumn

任何人都可以告诉我为什么这样有效;

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

第二个代码段在编辑时未显示SupplierName列表...

2 个答案:

答案 0 :(得分:5)

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

在第一个示例中,因为您的ComboBox是可视树的一部分,RelativeSource可以执行它应该执行的操作:沿着UI树查找您要求的项目。但在第二个示例中,DataGridComboBoxColumnDependencyObject,但它不是实际的UI元素 - 它是描述UI元素的对象。

您可以尝试使用ElementName,并为您的根窗口命名。或者,你可能只能逃脱:

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

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

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

答案 1 :(得分:0)

原因是无法找到DataGridComboBoxColumn的ItemsSource。

您需要使用RelativeSource Binding并将其指向正确的DataContext AncestorType。这将需要一些试验和错误来查找包含您的列表的DataContext以满足您的ItemsSource。