Редактировать : это новый ответ; Я оставил старый ответ внизу.
Если вы установите Path =. в CommandParameter вы получаете ContentPresenter в качестве объекта в команде. На данный момент я все еще не мог ссылаться на Uid или имя столбца. Таким образом, я создал DataGridTextColumnWithTag, который наследуется от DataGridTextColumn, и добавил свойство DependencyProperty с именем Tag. Теперь в OnDrilldownHeaderClicked я могу определить столбец, по которому щелкнули в таблице.
Вот шаблон данных в XAML:
<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>
Вот определение столбца DataGrid в XAML:
<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));
}
Вот команда Binding, используемая для поиска столбца, по которому щелкнули:
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>