我正在尝试更改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
似乎没有做任何事情。
答案 0 :(得分:4)
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
的{{1}}属性。最后你可以使用这样的风格:
ComboBox
在这种情况下,<DataGridComboBoxColumn ElementStyle="{StaticResource TextBlockComboBoxStyle}"
EditingElementStyle="{StaticResource {x:Type ComboBox}}" />
也是在其他地方定义的全局定义的EditingElementStyle
样式。
答案 1 :(得分: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}" />
答案 2 :(得分:0)
当控件未被编辑时,样式实际上是 TextBlock 类型。
DataGridComboBoxColumn
中没有允许对 ElementStyle
和 EditingElementStyle
使用相同样式的黑客。您必须使用 ComboBox
作为目标类型。