我正在尝试数据绑定
DataGridComboBoxColumn
<DataGridComboBoxColumn Header="Number of Copies" SelectedItemBinding="{Binding NumberCopies}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding LifeAreaList}"/>
<Setter Property="IsReadOnly" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
</DataGridComboBoxColumn>
我在这里做错了什么,因为我在运行时得到一个空的组合框。
我关注了
System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。 BindingExpression:Path=LifeAreaList;数据项=空;目标元素是“DataGridComboBoxColumn”(HashCode=49475561);目标属性是“ItemsSource”(类型“IEnumerable”)
DataGridColumn
不是从 FrameworkElement
或 FrameworkContentElement
派生的,因此它不在视觉树中并且没有 DataContext
,这就是您的绑定失败的原因。
如果您要绑定的
List<int>
对于每个项目都是相同的,那么也许您应该找到另一种方式来绑定它,也许您可以将其设为静态并在绑定中使用 StaticResource
。
无论如何,要将
ItemsSource
绑定到源类中的 List<int>
属性,您可以使用 ElementStyle
和 ElementEditingStyle
(正如其他人指出的那样)。以下应该有效
<DataGridComboBoxColumn Header="Number of Copies"
SelectedItemBinding="{Binding ListAreaItem}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding LifeAreaList}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding LifeAreaList}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
您不应该在样式中设置
ItemsSource
,列本身有这样一个属性,它可能会覆盖您尝试在样式中设置的任何内容。此外,您尝试将其设置为错误的样式(该样式用于显示模式),您可以尝试将其设置为EditingElementStyle
,但我也不建议这样做。
为什么要在样式中设置 Items 源?
你可以试试这个代码吗:
<my:DataGridTemplateColumn Header="Number of Copies" >
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=LifeAreaList}" >
<ComboBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding .}"></Label>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</my:DataGridTemplateColumn.CellTemplate>
</my:DataGridTemplateColumn>
如果 LifeAreaList 是复杂的类集合并且您希望以自定义方式显示它,请为 DataGridTemplateColumn 定义数据模板。
我会尝试使用PresentationTraceSources.TraceLevel =“High”的常规DataGridColumn,看看您是否遇到绑定问题。
如果您想使用类似于
DataGridCobmoboxColumn
的东西,最好使用DataGridTemplateColumn
,您可以使用它并具有相同的功能,而无需使用ItemsSource
StaticResource
。
我将
RelativeSource
中的根元素设置为UserControl
,如果您的DataGrid
位于Window
或Page
内部,则需要相应地使用它们。
<DataGridTemplateColumn Header="Number of Copies">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding NumberCopies}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding NumberCopies, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding DataContext.LifeAreaList, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>