【问题标题】:How do I style a DataGridHeader based on information from the DataGridColumn?如何根据来自 DataGridColumn 的信息设置 DataGridHeader 的样式?
【发布时间】:2011-03-04 18:42:57
【问题描述】:

我有一个 DataGrid,在那个网格中,一些列被标记为只读:

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
        <!-- this column is read only -->
        <DataGridTextColumn Header="Column A" Binding="{Binding Path=PropertyA}" IsReadOnly="True" />

        <!-- this column is EDITABLE -->
        <DataGridTextColumn Header="Name" Binding="{Binding Path=Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" />

        <!-- this column is read only -->
        <DataGridTextColumn Header="Column C" Binding="{Binding Path=PropertyC}" IsReadOnly="True" />
    </DataGrid.Columns>

我希望“名称”列可以通过可编辑的标题在视觉上区分,而其他两列则不可编辑。不过,我似乎无法访问 DataGridColumn 的 IsReadOnly 属性。

我实际上正在尝试做类似的事情:

<DataGrid.ColumnHeaderStyle>
     <Style TargetType="DataGridColumnHeader" >
         <Style.Triggers>
             <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=DataGridColumn}, Path=IsReadOnly}" Value="false">
                 <Setter Property="Background" Value="Azure" />
              </DataTrigger>
          </Style.Triggers>
      </Style>                                  
</DataGrid.ColumnHeaderStyle>

从这个问题: Binding Visible property of a DataGridColumn in WPF DataGrid,DataGridColumn 似乎不是框架元素,所以我无法使用 RelativeSource AncestorType=DataGridColumn 找到它。那张海报说他们使用静态资源来找到它,但没有解释什么/如何(还有几个答案是关于海报如何解决它的问题)

这个问题:How to get DataGridColumnHeader from DataGridColumn?,看起来我可以从 code 得到它,但我真的希望这只是 xaml 和通用的,适用于任何数据网格。

我忽略了一些简单的事情吗?

【问题讨论】:

    标签: wpf datagrid columnheader


    【解决方案1】:

    回答我自己的问题,以防其他人遇到这个......

    事实证明,由于问题中提到的一些事情,您可以在这里从 XAML 做的事情并不多。我可以从 XAML 中做的最简单的事情是使可编辑列的标题加粗,以将它们与其他列区分开来。

    <DataGridTextColumn Header="Editable Column" Binding="{Binding Path=EditableProperty,Mode=TwoWay}" IsReadOnly="False" Width="150">
        <DataGridTextColumn.HeaderStyle>
            <Style TargetType="DataGridColumnHeader">
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="ToolTip" Value="You can modify the values of this column."/>
            </Style>
        </DataGridTextColumn.HeaderStyle>
    </DataGridTextColumn>
    

    可以做更复杂的事情,比如:

    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="False">
            <Trigger.Setters>
                <Setter Property="Background">
                    <Setter.Value>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="{DynamicResource ControlLightColor}" Offset="0" />
                            <GradientStop Color="LightSteelBlue" Offset="1" />
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </Trigger.Setters>
        </Trigger>
    </Style.Triggers>  
    

    但是你最终会得到一些非常奇怪的行为,排序图标消失,或者其他奇怪的事情。如果您想更改列标题并使其看起来一致,您几乎必须通过样式和模板重新设置整个数据网格及其所有标题的样式。

    【讨论】:

      【解决方案2】:

      DataGridColumnHeader 有属性 Column,它有属性 IsReadOnly

      <Label  Content="(read only)" DockPanel.Dock="Bottom">
      <Label.Style>
          <Style TargetType="Label">
              <Setter Property="Visibility" Value="Collapsed"></Setter>
              <Style.Triggers>
                  <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=DataGridColumnHeader},Path=Column.IsReadOnly}" Value="True">
                      <Setter Property="Visibility" Value="Visible"></Setter>
                  </DataTrigger>
              </Style.Triggers>
          </Style>
      </Label.Style>
      

      在您的示例中,您可以这样做:

      <DataGrid.ColumnHeaderStyle>
       <Style TargetType="DataGridColumnHeader" >
           <Style.Triggers>
               <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=DataGridColumnHeader}, Path=Column.IsReadOnly}" Value="False">
                   <Setter Property="Background" Value="Azure" />
                </DataTrigger>
            </Style.Triggers>
        </Style>                                  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-07
        • 1970-01-01
        • 2018-04-04
        • 2019-12-08
        • 2014-07-27
        相关资源
        最近更新 更多