WPF中DataGridComboBoxColumn的ElementStyle错误

时间:2013-08-16 20:14:32

标签: wpf xaml datagrid styles datagridcomboboxcolumn

我正在尝试更改DataGrid ComboBox列的ElementStyle。据说,当控件未被编辑时,Style实际上是TextBlock类型。所以如其他例子所示,我试过了:

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

如果将其嵌入我的DataGridComboBoxColumn定义中,我会收到这个奇怪的错误消息:

  

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

TextBlockComboBox究竟是什么?或者更重要的是,我如何才能访问ElementStyle,因为定位ComboBox似乎没有做任何事情。

3 个答案:

答案 0 :(得分:4)

TextBlockComboBoxDataGridComboBoxColumn的内部类型。我也不知道如何设置该类型,但您可以使用DataGridComboBoxColumn.ElementStyle样式ComboBox来欺骗TextBlock

<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样式,并绑定Text的{​​{1}}属性。最后你可以使用这样的风格:

ComboBox

在这种情况下,<DataGridComboBoxColumn ElementStyle="{StaticResource TextBlockComboBoxStyle}" EditingElementStyle="{StaticResource {x:Type ComboBox}}" /> 也是在其他地方定义的全局定义的EditingElementStyle样式。

答案 1 :(得分:3)

在这种情况下,

ElementStyle应该是ComboBox的类型。我们有两种类型的DataGrid,它运行 - DataGridRowDataGridCell,第一个是一行,第二个是单元格。因此,默认情况下,所有内容都由DataGridCell而非TextBlock's类型的单元格组成。

要确定其他列的类型,请使用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}" />

答案 2 :(得分:0)

<块引用>

当控件未被编辑时,样式实际上是 TextBlock 类型。

DataGridComboBoxColumn 中没有允许对 ElementStyleEditingElementStyle 使用相同样式的黑客。您必须使用 ComboBox 作为目标类型。