web-dev-qa-db-de.com

Schaltfläche in einer Spalte, die die Zeile abruft, aus der sie im Click-Ereignishandler stammt

Ich habe die Elementquelle meines WPF-Datagrids auf eine Liste von Objekten festgelegt, die von meiner DAL zurückgegeben wurden. Ich habe auch eine zusätzliche Spalte hinzugefügt, die eine Schaltfläche enthält, die XAML ist unten.

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

Das macht gut. Gibt es jedoch bei der Button_Click -Methode eine Möglichkeit, die Zeile in dem Datagrid abzurufen, in dem sich die Schaltfläche befindet? Insbesondere ist eine der Eigenschaften meiner Objekte "Id", und ich möchte dies im Ereignishandler an den Konstruktor eines anderen Formulars übergeben können.

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

Vielleicht brauche ich etwas mehr in meinem XAML, oder vielleicht gehe ich das auf Umwegen an? Jede Hilfe/Ratschläge geschätzt.

92
RekrowYnapmoc

Grundsätzlich übernimmt Ihre Schaltfläche den Datenkontext eines Zeilendatenobjekts. Ich nenne es MyObject und hoffe, dass MyObject.ID das ist, was Sie wollten.

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

Eine andere Möglichkeit, dies zu tun, besteht darin, die ID an die CommandParameter-Eigenschaft der Schaltfläche zu binden:

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

Dann können Sie wie folgt im Code darauf zugreifen:

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

Eine andere Methode, die an den Befehlsparameter DataContext gebunden ist und MVVM wie Jobi Joy respektiert, besagt, dass button die Datenkontext-Formularzeile erbt.

Schaltfläche in XAML

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

Befehlsausführung

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

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

Wenn der DataContext Ihres DataGrid ein DataView-Objekt ist (die DefaultView-Eigenschaft einer DataTable), können Sie dies auch tun:

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