WPF DataGridTextColumHeaderTemplate привязывает ширину к текстовому столбцу шириной «*»

#c# #wpf

#c# #wpf

Вопрос:

У меня есть DataGrid с DataGridTextColum of width="*" (несколько из них, так что все они разделены поровну), и я хотел бы установить ширину этого DataGridTextColumn DataGridTextColumn.Header значения на его родительскую ширину ( DataGridTextColumn ).

Однако код не работает, причина в том, что я неправильно определяю RelativeSource , поэтому мой вопрос в том, как мне определить Binding , к Width чему внутри HeaderTemplate DataGridTextColumn привязывать DataGridTextColumn.ActualWidth ? Код ниже!

 <DataGridTextColumn Width="*" Binding="{Binding Username}" CanUserReorder="False" CanUserSort="False" x:Name="DataGridTextColumn">
   <DataGridTextColumn.HeaderTemplate>
        <DataTemplate>
             <StackPanel Orientation="Horizontal" Background="Red" MouseLeftButtonDown="EventSetter_OnHandler" Width="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=DataGridTextColumn},Path=ActualWidth, UpdateSourceTrigger=PropertyChanged}">
                    <Label>Username</Label>
             </StackPanel>
        </DataTemplate>
   </DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
  

Если я изменю источник привязки на ElementName, все будет работать нормально, как и ожидалось, но я бы хотел использовать RelativeSource, чтобы уменьшить количество имен, которые мне нужно сделать.

Спасибо!

Ответ №1:

DataGridColumn не является a FrameworkElement , поэтому он не будет отображаться в VisualTree . Это просто объект-держатель информации. То, что на самом деле отображается, — это DataGridColumnHeader для каждого Column . Таким образом, ваше HeaderTemplate содержимое будет присутствовать в этом DataGridColumnHeader . И это DataGridColumnHeader использует его Column свойство для поддержания его связи DataGridColumn . Итак,

Измените Width значение StackPanel на Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridColumnHeader},Path=Column.ActualWidth, UpdateSourceTrigger=PropertyChanged}" .