【问题标题】:ElementStyle error for DataGridComboBoxColumn in WPFWPF 中 DataGridComboBoxColumn 的 ElementStyle 错误
【发布时间】:2013-08-19 08:10:28
【问题描述】:

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

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

当它嵌入到我的 DataGridComboBoxColumn 定义中时,我会收到这个奇怪的错误消息:

“TextBlock”TargetType 与元素“TextBlockComboBox”的类型不匹配。

TextBlockComboBox 到底是什么?或者更重要的是,我怎样才能到达ElementStyle,因为定位ComboBox 似乎没有任何作用。

【问题讨论】:

    标签: wpf xaml datagrid styles datagridcomboboxcolumn


    【解决方案1】:

    TextBlockComboBoxDataGridComboBoxColumn 的内部类型。我也不知道如何设置该类型的样式,但您可以使用看起来像 TextBlockComboBox 样式来欺骗 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 样式。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 使用TemplateColumn 有效,所以我将其标记为答案。我仍然不明白为什么我的代码失败了,因为它来自另一个 Web 解决方案。但我只需要一个解决方案:)
      【解决方案3】:

      假设当控件没有被编辑时,样式实际上是 TextBlock 类型。

      没有,DataGridComboBoxColumn 中的 hack 允许 ElementStyleEditingElementStyle 使用相同的样式。您必须使用ComboBox 作为目标类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-08
        • 2010-12-26
        • 2011-08-03
        • 2017-06-25
        • 2010-12-15
        • 2013-03-04
        • 1970-01-01
        相关资源
        最近更新 更多