我正在尝试更改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
似乎没有任何作用。
TextBlockComboBox
是DataGridComboBoxColumn
的内部类型。我也不知道如何设置该类型的样式,但你可以通过使用看起来像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
样式,并绑定ComboBox
的Text
属性。最后你可以使用这样的风格:
<DataGridComboBoxColumn ElementStyle="{StaticResource TextBlockComboBoxStyle}"
EditingElementStyle="{StaticResource {x:Type ComboBox}}" />
在这种情况下,EditingElementStyle
再次是在别处定义的全局定义的ComboBox
样式。
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}" />
据推测,当控件未被编辑时,Style实际上是TextBlock类型。
不,在CCD_ 26中存在允许对CCD_ 27和CCD_ 28使用相同样式的破解。您必须使用ComboBox
作为目标类型。