Ошибка ElementStyle для DataGridComboBoxColumn в WPF

Я пытаюсь изменить ElementStyle столбца DataGrid ComboBox. Предположительно стиль действительно имеет тип TextBlock, когда элемент управления не редактируется. Итак, как показано в других примерах, я пробовал:

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

Когда это встроено в мое определение DataGridComboBoxColumn, я получаю это странное сообщение об ошибке:

«TextBlock» TargetType не соответствует типу элемента «TextBlockComboBox».

Что такое TextBlockComboBox? Или, что более важно, как я могу добраться до ElementStyle, потому что таргетинг на ComboBox, похоже, ничего не делает.


person Tekito    schedule 16.08.2013    source источник


Ответы (3)


ElementStyle в этом случае должен быть типом ComboBox. У нас есть два типа DataGrid, которыми он оперирует — DataGridRow и DataGridCell, первый — это строка, второй — ячейка. Поэтому по умолчанию все состоит из ячеек типа 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}" />
person Anatoliy Nikolaev    schedule 17.08.2013
comment
использование TemplateColumn работает, поэтому я отмечу это как ответ. Я до сих пор не понимаю, почему мой код потерпел неудачу, поскольку он был взят из другого веб-решения. Но мне нужно одно решение :) - person Tekito; 20.08.2013

TextBlockComboBox является внутренним типом для DataGridComboBoxColumn. Я также не знаю, как стилизовать этот тип, но вы можете обмануть 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 к ComboBox. Наконец, вы можете использовать стиль следующим образом:

<DataGridComboBoxColumn ElementStyle="{StaticResource TextBlockComboBoxStyle}"
                        EditingElementStyle="{StaticResource {x:Type ComboBox}}" />

EditingElementStyle в этом случае снова является глобально определенным стилем ComboBox, определенным в другом месте.

person pogosama    schedule 11.11.2014

Предположительно, Style действительно имеет тип TextBlock, когда элемент управления не редактируется.

Нет, в DataGridComboBoxColumn есть хак, позволяющий использовать один и тот же стиль для ElementStyle и EditingElementStyle. Вы должны использовать ComboBox в качестве целевого типа.

person Maxence    schedule 27.01.2021