首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF中DataGridComboBoxColumn的DataGridComboBoxColumn误差

WPF中DataGridComboBoxColumn的DataGridComboBoxColumn误差
EN

Stack Overflow用户
提问于 2013-08-16 20:14:32
回答 3查看 5K关注 0票数 6

我正在尝试修改ElementStyle的DataGrid ComboBox列。据推测,当控件未被编辑时,样式实际上是TextBlock类型的。因此,正如在其他例子中所示,我尝试过:

代码语言:javascript
复制
<DataGridComboBoxColumn.ElementStyle>
    <Style TargetType="TextBlock">
        <Setter Property="Background" Value="Green" />
    </Style>
</DataGridComboBoxColumn.ElementStyle>

当它嵌入到我的DataGridComboBoxColumn定义中时,我会得到一条奇怪的错误消息:

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

TextBlockComboBox到底是什么?或者更重要的是,我如何才能到达ElementStyle,因为目标ComboBox似乎什么都不做。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-17 15:38:59

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

若要确定另一列的类型,请使用DataGridTemplateColumn。因此,DataGridComboBoxColumn可能被定义为:

代码语言:javascript
复制
<DataGridTemplateColumn Width="1.5*" IsReadOnly="False" Header="Position2">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox x:Name="ComboBoxColumn" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

使用此集合可以是任何类型的控件。

在您的例子中,您需要为DataGridCell创建一个样式

代码语言:javascript
复制
<Style x:Key="StyleForCell" TargetType="{x:Type DataGridCell}">
    <Setter Property="Background" Value="Green" />
</Style>

像这样使用:

代码语言:javascript
复制
<DataGridComboBoxColumn x:Name="ComboBoxColumn" 
                        CellStyle="{StaticResource StyleForCell}"
                        Header="Position"
                        SelectedItemBinding="{Binding Position}" />
票数 3
EN

Stack Overflow用户

发布于 2014-11-11 15:30:01

TextBlockComboBoxDataGridComboBoxColumn的内部类型。我也不知道如何使该类型具有样式,但您可以通过使用看起来像DataGridComboBoxColumn.ElementStyleComboBox样式来欺骗TextBlock

代码语言:javascript
复制
<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属性。最后,您可以使用这样的样式:

代码语言:javascript
复制
<DataGridComboBoxColumn ElementStyle="{StaticResource TextBlockComboBoxStyle}"
                        EditingElementStyle="{StaticResource {x:Type ComboBox}}" />

本例中的EditingElementStyle也是在其他地方定义的全局定义的ComboBox样式。

票数 4
EN

Stack Overflow用户

发布于 2021-01-27 18:37:11

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

不,DataGridComboBoxColumn中存在允许ElementStyleEditingElementStyle使用相同样式的黑客。您必须使用ComboBox作为目标类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18281455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档