Редактировать: это новый ответ; Я оставил старый ответ внизу.
Если вы установили Path =. в CommandParameter вы получаете ContentPresenter как объект в Command. На этом этапе я все еще не мог ссылаться на Uid или Name of Column. Таким образом, я создал DataGridTextColumnWithTag, который наследуется от DataGridTextColumn, и я добавил DependencyProperty под названием Tag. Теперь в OnDrilldownHeaderClicked я могу определить столбец, нажатый в Grid.
Здесь DataTemplate в 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));
}
Вот командная привязка, используемая для поиска столбца, на который было нажато:
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>
Какая версия .NET вы используете? CommandParameter не привязывается к версиям до 4.0. –
Я использую 4.0. Я пробую это в течение последних 4 часов, но не мог этого понять. Кажется, довольно просто. Все, что мне нужно, - связать с родительским свойством с datatemplate. Это, кажется, серьезная ошибка или я что-то не хватает ... –