我想要将我在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>
答案 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
,或者添加第三个子项以填充中间的空间。