web-dev-qa-db-fra.com

Bouton dans une colonne, obtenant la ligne d'où il vient dans le gestionnaire d'événements Click

J'ai défini la source d'éléments de ma grille de données WPF sur une liste d'objets renvoyée par mon DAL. J'ai également ajouté une colonne supplémentaire contenant un bouton, le xaml est en 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 bien. Cependant, sur la méthode Button_Click, y a-t-il un moyen d'obtenir la ligne sur la grille de données où réside le bouton? Plus précisément, l'une des propriétés de mes objets est "Id", et j'aimerais pouvoir le transmettre au constructeur d'un autre formulaire 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 j'y vais d'une manière détournée? Toute aide/conseil apprécié.

92
RekrowYnapmoc

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
}
119
Jobi Joy

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;
}
41
xr280xr

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)
        {

        }
    }
10
Petr Šebesta
MyObject obj= (MyObject)((Button)e.Source).DataContext;
3
Shiha

Si le DataContext de votre DataGrid est un objet DataView (la propriété DefaultView d'un DataTable), vous pouvez également le faire:

private void Button_Click(object sender, RoutedEventArgs e) {
   DataRowView row = (DataRowView)((Button)e.Source).DataContext;
}
0
SurfingSanta