2

我有一个 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. 那张海报说他们使用静态资源来找到它,但没有解释什么/如何(还有几个答案是关于海报如何解决它的问题)

这个问题:如何从 DataGridColumn 获取 DataGridColumnHeader?,看起来我可以从代码中得到它,但我真的希望这只是 xaml 和通用的,以适用于任何数据网格。

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

4

2 回答 2

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>  

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

于 2011-06-28T16:09:00.033 回答
0

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>                                  

于 2020-06-19T07:33:03.090 回答