Как мне стилизовать DataGridHeader на основе информации из DataGridColumn? - PullRequest
1 голос
/ 04 марта 2011

У меня есть 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>

Я хочу, чтобы столбец «Имя» был визуально различим по заголовку, чтобы он был редактируемым,когда два других столбца нет.Однако я не вижу возможности добраться до свойства IsReadOnly объекта DataGridColumn.

Я эффективно пытаюсь сделать что-то вроде:

<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Видимое свойство DataGridColumn в WPF DataGrid . Похоже, что DataGridColumn не является элементом инфраструктуры, поэтому я не могу найти его с помощью RelativeSource AncestorType=DataGridColumn.На этом плакате написано, что они использовали статический ресурс, чтобы найти его, но не объясняет, что / как (и на несколько ответов есть вопросы о том, как его решил)

Этот вопрос: Как получить DataGridColumnHeaderиз DataGridColumn? , похоже, что я мог бы получить его из кода , но мне бы очень хотелось, чтобы это было просто xaml и универсально для применения к любой сетке данных.

Есть что-то простое, что я пропускаю?

1 Ответ

1 голос
/ 28 июня 2011

Отвечая на мой вопрос, на случай, если кто-нибудь еще столкнется с этим ...

Оказывается, вы не можете сделать здесь из 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>  

Но в итоге вы получаете действительно странное поведение, при котором значок сортировки исчезает, или другие странные вещи. Если вы хотите изменить заголовки столбцов и сделать их выглядящими непротиворечивыми, вам в значительной степени придется перекомпилировать целом сетку данных и все ее заголовки через стили и шаблоны.

...