104 votes

WPF DataGrid - Bouton dans une colonne, obtenant la ligne d'origine dans le gestionnaire d'événements Click

J'ai réglé le itemsource de mon WPF Datagrid à une Liste d'Objets de retour de mon DAL. J'ai également ajouté une colonne supplémentaire qui contient un bouton, le code xaml est ci-dessous.

<toolkit:DataGridTemplateColumn  MinWidth="100" Header="View">
    <toolkit:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Click="Button_Click">View Details</Button>
        </DataTemplate>
    </toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>

Cela rend très bien. Cependant sur le Button_Click méthode, est-il possible que je peux obtenir de la ligne sur la grille de données où le bouton réside? Plus spécifiquement, l'une des propriétés de mes objets est "Id", et je voudrais être en mesure de passer ce dans le constructeur d'une autre forme dans le gestionnaire d'événements.

private void Button_Click(object sender, RoutedEventArgs e)
    {
        //I need to know which row this button is on so I can retrieve the "id"  
    }

Peut-être que j'ai besoin de quelque chose de plus dans mon xaml, ou peut-être que je vais à ce sujet dans un rond-point? Toute aide/conseils appréciés.

136voto

Jobi Joy Points 20883

Fondamentalement, votre bouton héritera du contexte de données d'un objet de données de ligne. Je l'appelle comme MyObject et j'espère que MyObject.ID est ce que vous vouliez.

 private void Button_Click(object sender, RoutedEventArgs e)
{
    MyObject obj = ((FrameworkElement)sender).DataContext as MyObject;
    //Do whatever you wanted to do with MyObject.ID
}
 

50voto

xr280xr Points 2057

Une autre façon que j'aime faire est de lier l'ID à la propriété CommandParameter du bouton:

 <Button Click="Button_Click" CommandParameter="{Binding Path=ID}">View Details</Button>
 

Ensuite, vous pouvez y accéder comme dans le code:

 private void Button_Click(object sender, RoutedEventArgs e)
{
    object ID = ((Button)sender).CommandParameter;
}
 

12voto

Petr Šebesta Points 51

Une autre façon de se lier au paramètre de commande DataContext et de respecter MVVM, comme Jobi Joy dit que le bouton hérite de la ligne de formulaire datacontext.

Bouton en XAML

 <RadButton Content="..." Command="{Binding RowActionCommand}" 
                         CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}"/>
 

Mise en œuvre de la commande

 public void Execute(object parameter)
    {
        if (parameter is MyObject)
        {

        }
    }
 

5voto

Shiha Points 21
MyObject obj= (MyObject)((Button)e.Source).DataContext;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X