任何人都可以告诉我为什么这样有效;
<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列表...
答案 0 :(得分:5)
这是因为DataGridComboBoxColumn
不是用户界面元素,但ComboBox
是。
在第一个示例中,因为您的ComboBox
是可视树的一部分,RelativeSource
可以执行它应该执行的操作:沿着UI树查找您要求的项目。但在第二个示例中,DataGridComboBoxColumn
是DependencyObject
,但它不是实际的UI元素 - 它是描述UI元素的对象。
您可以尝试使用ElementName
,并为您的根窗口命名。或者,你可能只能逃脱:
<DataGridComboBoxColumn ...
ItemsSource="{Binding Path=Suppliers}" />
DataContext
将从窗口向下流向网格,因此除非您在UI中此处用其他东西覆盖它,否则它仍然可用。
或者,如果这不起作用,您可能希望将相关集合添加到资源字典中,以便在绑定中使用Source={StaticResource suppliers}
来获取它。
答案 1 :(得分:0)
原因是无法找到DataGridComboBoxColumn的ItemsSource。
您需要使用RelativeSource Binding并将其指向正确的DataContext AncestorType。这将需要一些试验和错误来查找包含您的列表的DataContext以满足您的ItemsSource。