在DataGridColumn的HeaderTemplate中通过绑定设置宽度

时间:2013-07-02 14:14:43

标签: wpf

我想要将我在HeaderTemplate中使用的DockPanel的宽度设置为列的实际宽度,并且正在努力使用绑定。

<DataTemplate x:Key="MyHeaderTemplate">
    <DockPanel HorizontalAlignment="Stretch" 
               LastChildFill="False"
               Width="{Binding Width, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridColumnHeader}}}">
        <!-- Several items here. Some docked to the left side, some to the right-->
    </DockPanel>
</DataTemplate>

这给了我一个绑定错误,并将所有项目压缩在标题的左侧。


[编辑]

绑定到ActualWidth而不是Width给了我这两个绑定错误并且过多地增加了列的宽度,因此它右边的所有列看起来都被“推出”了可见区域:

  • System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=AreRowDetailsFrozen; DataItem=null; target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation')
  • System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=HeadersVisibility; DataItem=null; target element is 'DataGridRowHeader' (Name=''); target property is 'Visibility' (type 'Visibility')

[编辑]

我不在乎,布局控件是否是DockPanel或其他东西,只要它填充标题,我可以在左边排列一个TextBlock,在右边排列几个图标......


[编辑]

我想要的是“左”显示在左侧,“右”显示在右侧。现在左边是“LeftRight”。

<UserControl x:Class="Lb.Abrechnung.Kunden.Fbs.Client.Rechnungslauf.Dialoge.RechnungslaufWizard.Rechnungsvorschlaege.RechnungsvorschlagListe.TestView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"
         HorizontalContentAlignment="Stretch">
<Grid>
    <DataGrid Background="Black">
        <DataGrid.ColumnHeaderStyle>
            <Style TargetType="DataGridColumnHeader">
                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                <Setter Property="Foreground" Value="White" />
            </Style>
        </DataGrid.ColumnHeaderStyle>
        <DataGrid.Columns>
            <DataGridTextColumn>
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <DockPanel Width="{Binding Width, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridColumnHeader}}}">
                            <TextBlock Text="Left" DockPanel.Dock="Left"/>
                            <TextBlock Text="Right" DockPanel.Dock="Right"/>
                        </DockPanel>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

1 个答案:

答案 0 :(得分:2)

我怀疑代码不起作用的原因之一是:

  • DataGridColumnHeader使用Auto宽度,Width属性存储为Double.NaN。您需要使用ActualWidth属性来获取计算值。

  • 您可能已经设置了双向绑定,因此不是DockPanel继承DataGridColumnHeader的宽度,而是以相反的方式工作。使用ActualWidth也应该解决这个问题,因为它是一个只读属性。

然而,绑定不是必需的。如果您在HorizontalContentAlignment上将Stretch设置为DataGridColumnHeader,则标题模板应自动填充标题:

<DataGrid>
    <DataGrid.ColumnHeaderStyle>
        <Style TargetType="DataGridColumnHeader">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </DataGrid.ColumnHeaderStyle>
</DataGrid>

修改 这确实有效,您可以通过给DockPanel一个背景颜色来判断它是否覆盖了标题的整个区域。内容仍未显示在右侧的原因是DockPanel的{​​{3}}行为。最后一个孩子“正确”正在填充剩余空间(文本左对齐,因此不会移动)。要使其尊重DockPanel.Dock="Right"设置,您需要将LastChildFill设置为False,或者添加第三个子项以填充中间的空间。