DataGridComboBoxColumn 数据绑定

问题描述 投票:0回答:5

我正在尝试数据绑定

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”)

.net wpf xaml datagrid binding
5个回答
9
投票

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>

2
投票

您不应该在样式中设置

ItemsSource
,列本身有这样一个属性,它可能会覆盖您尝试在样式中设置的任何内容。此外,您尝试将其设置为错误的样式(该样式用于显示模式),您可以尝试将其设置为
EditingElementStyle
,但我也不建议这样做。


1
投票

为什么要在样式中设置 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 定义数据模板。


0
投票

我会尝试使用PresentationTraceSources.TraceLevel =“High”的常规DataGridColumn,看看您是否遇到绑定问题。


0
投票

如果您想使用类似于

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>
© www.soinside.com 2019 - 2024. All rights reserved.