#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}"
.