2010-10-04 13 views
1

Je datatemplate un en-tête de grille avec un bouton. Lorsque le bouton est cliqué, Je veux envoyer l'UID (qui est une propriété de la colonne de la grille (parent)) en tant que paramètre de la commande.WPF - Question DataTemplate

I Tried: 1. Modèle de liaison 2. Source relative 3. ElementName (ne marche pas accpet Binding) Mais rien ne semble fonctionner. Tout indice, comment lier à la propriété d'un parent dans datatemplate?

<UserControl.Resources> 
     <DataTemplate x:Key="ClickableHeaderTemplate"> 
      <Button x:Name="btn" Content="{Binding}" Background="Transparent" 
        Command="{Binding DrilldownHeaderClicked}" 
        CommandParameter="{Binding ElementName=????, Path=Uid}" > 
      </Button> 
     </DataTemplate> 
    </UserControl.Resources> 

<DataGrid> 
<DataGridTextColumn x:Name="TotalOid" x:Uid="PhMg5Ph-Oid" 
    Binding="{Binding TotalOid, Mode=OneWay,TargetNullValue=-}" 
Header="Col1" 
HeaderTemplate="{StaticResource ResourceKey=ClickableHeaderTemplate}"> 
</DataGridTextColumn> 
</Datagrid> 
+0

Quelle version de .NET utilisez-vous? CommandParameter n'est pas lié dans les versions antérieures à la version 4.0. –

+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 .... –

Répondre

2

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> 
+0

CommandParameter = "{Binding Uid}" –

+0

déjà essayé ceux-ci. ne fonctionne pas. –

+0

Le problème est l'en-tête de la grille est soumis à la localisation et va changer. donc ne peux pas utiliser le texte de l'en-tête. –

Questions connexes