我正试图向默认的TextBox中添加一个ComboBox (当我完成此工作时,还会添加一个ComboBox),并且已经这样做了,如下所示。这在应用程序ResourceDirectory^:
<Style x:Key="DataGridColumnHeaderStyle_TextBox" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Themes:DataGridHeaderBorder Grid.Row="0" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" IsClickable="{TemplateBinding CanUserSort}" IsPressed="{TemplateBinding IsPressed}" IsHovered="{TemplateBinding IsMouseOver}" Padding="{TemplateBinding Padding}" SortDirection="{TemplateBinding SortDirection}" SeparatorBrush="{TemplateBinding SeparatorBrush}" SeparatorVisibility="{TemplateBinding SeparatorVisibility}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
<TextBox Grid.Row="1" Text="" HorizontalAlignment="Stretch" BorderThickness="1" />
<Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}"/>
<Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}"/>
</Grid>
</Themes:DataGridHeaderBorder>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>在我的Window DataGrid中,我有以下内容:
<DataGridTextColumn Header="PO Number" Binding="{Binding PO_Number}" HeaderStyle="{DynamicResource DataGridColumnHeaderStyle_TextBox}"/>这看起来像我现在想要的样子,Header文本绑定到ContentPresenter上。
问题
如何设置它,以便绑定到新添加的TextBox (或其他任何对象),如:HeaderTemplate.TextBox.Text="{Binding SomeSubTotalClass}"
<DataGridTextColumn Header="PO Number" HeaderTemplate.TextBox.Text="{Binding SomeSubTotalClass}" Binding="{Binding PO_Number}" HeaderStyle="{DynamicResource DataGridColumnHeaderStyle_TextBox}"/>发布于 2020-12-08 10:07:52
您可以为自定义列标题创建一组附加属性。
public static class DataGridHeaderProperties
{
public static readonly DependencyProperty TextProperty = DependencyProperty.RegisterAttached(
"Text", typeof(string), typeof(DataGridHeaderProperties));
public static string GetText(DependencyObject dependencyObject)
{
return (string)dependencyObject.GetValue(TextProperty);
}
public static void SetText(DependencyObject dependencyObject, string value)
{
dependencyObject.SetValue(TextProperty, value);
}
}然后调整列标题模板,以便TextBox的TextBox属性绑定到相应的数据网格列定义中指定的附加属性。
<TextBox Grid.Row="1" Text="{Binding Column.(local:DataGridHeaderProperties.Text), RelativeSource={RelativeSource AncestorType={x:Type DataGridColumnHeader}}}" HorizontalAlignment="Stretch" BorderThickness="1" />现在,在列定义上设置属性。下面只有一个用于测试的静态文本,但是您可以以任何方式绑定该属性。
<DataGridTextColumn Header="PO Number"
Binding="{Binding PO_Number}"
HeaderStyle="{StaticResource DataGridColumnHeaderStyle_TextBox}"
local:DataGridHeaderProperties.Text="My custom text"/>但是,请注意,列不是可视树的一部分,也没有可以绑定到的数据上下文,因此必须使用binding proxy或其他机制。对于DataGrid来说,这是一个众所周知的问题,而不是这个问题的核心,但是在StackOverflow上已经有了解决方案。
可以将此解决方案扩展到列标题中的任何其他控件,如ComboBox。您只需添加附加属性,例如对于ItemsSource、SelectedItem等,但是您也应该投资一些来改进这个概念。将这类控件放入列标题中似乎很奇怪。它可能会损害应用程序的可用性。也许有一种更适合您的需求的方法。
https://stackoverflow.com/questions/65189692
复制相似问题