从标题模板中查找DataGridColumn

时间:2011-11-09 16:24:52

标签: wpf xaml data-binding

如何从HeaderTemplate模板中找到DataGridTextColumn?有没有办法只使用XAML执行此操作?我尝试过类型为DataGridTextColumn的FindAncestor,但找不到它。

我知道DataGridTextColumn不是可视化树的一部分。有没有解决方法呢?

2 个答案:

答案 0 :(得分:0)

你真的需要整个列对象吗? DataContext将是您作为标题传入的任何内容,例如

<DataGridTextColumn Header="Name" Binding="{Binding Name}">
    <DataGridTextColumn.HeaderTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" Foreground="Red" />
        </DataTemplate>
    </DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>

这将导致带有文字“名称”的红色标题。

如果您确实需要该列,则可以使用ElementName绑定:

<DataGrid ItemsSource="{Binding Data}">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="nameColumn" Header="Name" Binding="{Binding Name}">
            <DataGridTextColumn.HeaderTemplate>
                <DataTemplate>
                    <TextBlock Foreground="Red">
                        <Run Text="{Binding Mode=OneWay}" />
                        <Run Text=" - " />
                        <Run Text="{Binding ActualWidth, ElementName=nameColumn, Mode=OneWay}" />
                    </TextBlock>
                </DataTemplate>
            </DataGridTextColumn.HeaderTemplate>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

这显示“名称”和标题中的列宽。

答案 1 :(得分:0)

使用find ancestor works在datagrid中按索引访问列。

<DataGrid ItemsSource="{Binding Data}">
<DataGrid.Columns>
    <DataGridTextColumn x:Name="nameColumn" Header="Name" Binding="{Binding Name}">
        <DataGridTextColumn.HeaderTemplate>
            <DataTemplate>
                <TextBlock Foreground="Red">
                    <Run Text="{Binding Mode=OneWay}" />
                    <Run Text=" - " />
                    <Run Text="{Binding Columns[0].ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Mode=OneWay}" />
                </TextBlock>
            </DataTemplate>
        </DataGridTextColumn.HeaderTemplate>
    </DataGridTextColumn>
</DataGrid.Columns>