WPF中DataGridComboBoxColumn的ElementStyle错误

6

我正在尝试修改DataGrid ComboBox列的ElementStyle。据说当控件未被编辑时,样式实际上是TextBlock类型。因此,根据其他示例所示,我尝试了以下操作:

<DataGridComboBoxColumn.ElementStyle>
    <Style TargetType="TextBlock">
        <Setter Property="Background" Value="Green" />
    </Style>
</DataGridComboBoxColumn.ElementStyle>

当我将此内容嵌入到我的DataGridComboBoxColumn定义中时,我得到了一个奇怪的错误信息:

'TextBlock' TargetType与元素'TextBlockComboBox'的类型不匹配。

究竟什么是TextBlockComboBox?或者更重要的是,我该如何访问ElementStyle,因为针对ComboBox没有任何作用。
3个回答

4

TextBlockComboBoxDataGridComboBoxColumn 内部类型。我也不知道如何将该类型样式化,但是您可以通过使用与 TextBlock 类似的 ComboBox 样式来欺骗 DataGridComboBoxColumn.ElementStyle

<Style x:Key="TextBlockComboBoxStyle"
       TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBox}">
                <TextBlock Text="{TemplateBinding Text}"
                           Style="{StaticResource {x:Type TextBlock}}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

在上述样式中,我使用了在其他地方定义的全局TextBlock样式,并绑定了ComboBoxText属性。最后,您可以像这样使用该样式:
<DataGridComboBoxColumn ElementStyle="{StaticResource TextBlockComboBoxStyle}"
                        EditingElementStyle="{StaticResource {x:Type ComboBox}}" />

在这种情况下,EditingElementStyle 是全局定义的 ComboBox 样式,在其他地方定义。

3
在这种情况下,ElementStyle 应该是 ComboBox 的类型。我们有两种类型的 DataGrid,它们操作的是 DataGridRowDataGridCell,前者是行,后者是单元格。因此,默认情况下,所有内容都由 DataGridCell 类型的单元格组成,而不是 TextBlock
要确定另一列的类型,请使用 DataGridTemplateColumn。因此,DataGridComboBoxColumn 可能被定义为:
<DataGridTemplateColumn Width="1.5*" IsReadOnly="False" Header="Position2">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox x:Name="ComboBoxColumn" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

使用此设置可以进行任何类型的控制。

在您的情况下,您需要创建一个 DataGridCell 样式:

<Style x:Key="StyleForCell" TargetType="{x:Type DataGridCell}">
    <Setter Property="Background" Value="Green" />
</Style>

并且像这样使用:

<DataGridComboBoxColumn x:Name="ComboBoxColumn" 
                        CellStyle="{StaticResource StyleForCell}"
                        Header="Position"
                        SelectedItemBinding="{Binding Position}" />

1
使用 TemplateColumn 可以解决问题,所以我将其标记为答案。虽然代码来自另一个网络解决方案,但我仍然不完全理解它为什么失败。但是一个解决方案就足够了 :) - Tekito

0
据说当控件不在编辑状态时,样式实际上是 TextBlock 类型。
不,DataGridComboBoxColumn 中有一个 hack,允许使用相同的样式作为 ElementStyleEditingElementStyle。您必须将目标类型设置为 ComboBox

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