WPF中DataGridComboBoxColumn的ElementStyle错误



我正在尝试更改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似乎没有任何作用。

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样式。

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}" />

据推测,当控件未被编辑时,Style实际上是TextBlock类型。

不,在CCD_ 26中存在允许对CCD_ 27和CCD_ 28使用相同样式的破解。您必须使用ComboBox作为目标类型。

相关内容

  • 没有找到相关文章