Modifier: cette une nouvelle réponse; J'ai laissé la vieille réponse en bas.
Si vous définissez Path =. Dans CommandParameter, vous obtenez ContentPresenter en tant qu'objet dans la commande. À ce stade, je ne pouvais toujours pas faire référence à l'Uid ou au nom de la colonne. Ainsi j'ai créé DataGridTextColumnWithTag qui hérite de DataGridTextColumn et j'ai ajouté un DependencyProperty appelé Tag. Maintenant, dans OnDrilldownHeaderClicked je peux déterminer la colonne cliquée dans la grille.
Voici le DataTemplate en 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>
Voici la définition de la DataGrid Colonne en XAML:
<Helpers:DataGridTextColumnWithTag
Header="Extra Name"
Tag="234"
Width="SizeToCells"
Binding="{Binding FinalName}"
FontSize="20"
HeaderTemplate="{StaticResource ResourceKey=ClickableHeaderTemplate}">
</Helpers:DataGridTextColumnWithTag>
Voici la nouvelle colonne 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));
}
Voici Command Binding utilisé pour trouver la colonne cliquée sur:
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;
}
}
}
}
Remarque: il s'agit de l'ancienne réponse. Ce code obtient l'en-tête de la colonne, mais est fragile si/quand le nom de la colonne change.
Le DataTemplate suivant me permet d'obtenir l'en-tête de la colonne.
Puis j'utilise l'en-tête pour comprendre la colonne.
J'espère que cela vous permet de démarrer.
Si vous pouvez étendre cette solution, veuillez poster votre réponse.
<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>
Quelle version de .NET utilisez-vous? CommandParameter n'est pas lié dans les versions antérieures à la version 4.0. –
J'utilise 4.0. J'essaye ceci pour les 4 dernières heures mais ne pourrais pas le figurer. Cela semble assez simple cependant. Tout ce dont j'ai besoin est de lier à la propriété d'un parent à partir d'un datatemplate. Cela semble être un bug sérieux ou est-ce que je manque quelque chose .... –