问题描述
我发现了如何在WPF中为ToolTip
创建DataGridColumnHeader
(并确保包头已包好)。
<Style x:Key="StartingTabToolTipHeaderStyle" targettype="DataGridColumnHeader">
<Setter Property="ToolTip" Value="{x:Static r:Resource.StartingTabToolTip}"/>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock textwrapping="Wrap" Text="{Binding}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
我可以通过这种方式使用这种样式:
<DataGridComboBoxColumn Header="{x:Static r:Resource.StartingTab}" SelectedItembinding="{Binding StartingTab}"
HeaderStyle="{StaticResource StartingTabToolTipHeaderStyle}">
此解决方案不是很好,因为我需要为每个标头创建一个单独的样式,因为工具提示已硬连接到样式中。我想要一种可以以这种方式使用的通用样式:
<DataGridComboBoxColumn Header="{x:Static r:Resource.StartingTab}" SelectedItembinding="{Binding StartingTab}"
MyToolTip="{x:Static r:Resource.StartingTabToolTip}">
任何想法怎么做?可能带有附加财产?
解决方法
您可以在每列上设置ToolTipService.ToolTip
附加属性并将其绑定到该属性,因为该属性未在列上使用。
<DataGridComboBoxColumn Header="{x:Static r:Resource.StartingTab}"
SelectedItemBinding="{Binding StartingTab}"
HeaderStyle="{StaticResource StartingTabToolTipHeaderStyle}"
ToolTipService.ToolTip="{x:Static r:Resource.StartingTabToolTip}">
然后,您可以使用RelativeSource
绑定以标题样式将此文本绑定到列上。
<Style x:Key="StartingTabToolTipHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="ToolTip" Value="{Binding Column.(ToolTipService.ToolTip),RelativeSource={RelativeSource Self}}"/>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock TextWrapping="Wrap" Text="{Binding}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
现在您只有一个样式。如果要避免在每列上设置样式,请省略x:Key
使其成为隐式样式。然后它将应用于范围内的所有匹配类型。
<Style TargetType="{x:Type DataGridColumnHeader}">
,
您可以使用DataGridTemplateColumn
<DataGrid AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="yourHeader" HeaderStyle={StaticResource HeaderStyle1}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<!--you can add any control such as ComboBox,Button etc-->
<TextBlock Text="{Binding Message}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<!--Editing cell template is not mandatory,only if you want allow user to edit a particular cell,shown here only for reference-->
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<!--When the user double clicks on this cell,it changes the control to TextBox (from TextBlock - see above) to allow for user input-->
<TextBox Text="{Binding Message}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<!--Second Column-->
<DataGridTemplateColumn Header="secondHeader" HeaderStyle={StaticResource HeaderStyle2}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemSource="{Binding SomeSource}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
对于每列,这似乎有点过多。但是,它为将来的复杂更改提供了更多的控制权和更好的可伸缩性。在最初的开发阶段就投入了一些琐碎的工作。
我的观点是,自从概念成功之后,就针对用户如何/何时与UI元素进行交互的特定规则和逻辑,特别是在更改数据时,提出了一些进一步的输入/更改和新要求,以改善用户的交互性。
编辑-
您的样式可以与您制作的样式完全相同,即定位DataGridColumnHeader
。