WPF DataGridTextColumHeaderTemplate绑定宽度到"*"的TextCo

本文关键字:quot TextCo DataGridTextColumHeaderTemplate 绑定 WPF | 更新日期: 2023-09-27 18:09:49

我有一个DataGridDataGridTextColumwidth="*"(它们的倍数,所以它们都是等分的),我想把这个DataGridTextColumnDataGridTextColumn.Header的宽度设置为它的父宽度(DataGridTextColumn)。

然而代码不起作用,原因是我没有定义RelativeSource正确,所以我的问题是,我如何在DataGridTextColumnHeaderTemplate内定义BindingWidth以绑定到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来减少我必须做的命名量。

谢谢!

WPF DataGridTextColumHeaderTemplate绑定宽度到"*"的TextCo

DataGridColumn不是FrameworkElement,所以它不会出现在VisualTree中。它仅仅是一个信息持有实体。实际渲染的是每个Column对应一个DataGridColumnHeader。因此,您的HeaderTemplate内容将出现在此DataGridColumnHeader中。这个DataGridColumnHeader使用它的Column属性来维持它与DataGridColumn的关联。

StackPanelWidth更改为Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridColumnHeader},Path=Column.ActualWidth, UpdateSourceTrigger=PropertyChanged}"