编辑:这是一个新的答案;我把旧答案留在了底部。
如果您设置 Path=.在 CommandParameter 中,您将 ContentPresenter 作为 Command 中的对象。此时我仍然无法引用列的 Uid 或名称。因此,我创建了继承自 DataGridTextColumn 的 DataGridTextColumnWithTag,并添加了一个名为 Tag 的 DependencyProperty。现在在 OnDrilldownHeaderClicked 中,我可以确定在 Grid 中单击的列。
这是 XAML 中的 DataTemplate:
<Window.Resources>
<c:CommandReference x:Key="DrilldownHeaderClickedReference" Command="{Binding DrilldownHeaderClicked}" />
<DataTemplate x:Key="ClickableHeaderTemplate">
<Button Content="{Binding}" Background="Transparent"
Command="{StaticResource DrilldownHeaderClickedReference}"
CommandParameter="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=.}" >
</Button>
</DataTemplate>
</Window.Resources>
这是 XAML 中 DataGrid 列的定义:
<Helpers:DataGridTextColumnWithTag
Header="Extra Name"
Tag="234"
Width="SizeToCells"
Binding="{Binding FinalName}"
FontSize="20"
HeaderTemplate="{StaticResource ResourceKey=ClickableHeaderTemplate}">
</Helpers:DataGridTextColumnWithTag>
这是新的 DataGrid 列:
public class DataGridTextColumnWithTag : DataGridTextColumn
{
public DataGridTextColumnWithTag() : base() { }
public string Tag
{
get { return (string)this.GetValue(TagProperty); }
set { this.SetValue(TagProperty, value); }
}
public static readonly DependencyProperty TagProperty = DependencyProperty.Register(
"Tag", typeof(string), typeof(DataGridTextColumnWithTag), new PropertyMetadata(string.Empty));
}
这里是用于查找点击的列的命令绑定:
public ICommand DrilldownHeaderClicked { get; set; }
private void OnDrilldownHeaderClicked(object obj)
{
ContentPresenter cp = obj as ContentPresenter;
if (cp != null)
{
DataGridColumnHeader tp = cp.TemplatedParent as DataGridColumnHeader;
if ( tp != null )
{
DataGridTextColumnWithTag column = tp.Column as DataGridTextColumnWithTag;
if ( column != null )
{
string tag = column.Tag;
}
}
}
}
注意:这是旧答案。此代码获取列标题,但如果/当列名称更改时会很脆弱。
以下 DataTemplate 为我获取列的标题。
然后我使用标题找出列。
希望这可以帮助您入门。
如果您可以扩展此解决方案,请发布您的答案。
<UserControl.Resources>
<c:CommandReference x:Key="DrilldownHeaderClickedReference" Command="{Binding DrilldownHeaderClicked}" />
<DataTemplate x:Key="ClickableHeaderTemplate">
<Button x:Name="btn" Content="{Binding}" Background="Transparent"
Command="{StaticResource DrilldownHeaderClickedReference}"
CommandParameter="{Binding}" >
</Button>
</DataTemplate>
</UserControl.Resources>