WPF DataGrid - кнопка в столбце, получающая строку, из которой она появилась в обработчике событий Click

Я установил источник items моего WPF Datagrid в список объектов, возвращаемых из моего DAL. Я также добавил дополнительный столбец, который содержит кнопку, xaml находится ниже.

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

Это отлично. Однако в методе Button_Click, есть ли способ получить строку на datagrid, где находится кнопка? В частности, одним из свойств моих объектов является "Id", и я хотел бы передать это в конструктор другой формы в обработчике событий.

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

Возможно, мне нужно что-то лишнее в моем xaml, или, может быть, я об этом обойду? Любая помощь/советы оценены.

Ответ 1

В основном ваша кнопка наследует datacontext объекта данных строки. Я называю это MyObject и надеюсь, что MyObject.ID - это то, что вы хотели.

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

Ответ 2

Другим способом, который я хотел бы сделать это, является привязка идентификатора к свойству CommandParameter кнопки:

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

Затем вы можете получить доступ к нему, как в коде:

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

Ответ 3

Другой способ, который связывается с параметром команды DataContext и уважает MVVM, например, Джоби Джой говорит, что кнопка наследует строку формы datacontext.

Кнопка в XAML

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

Выполнение команд

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

        }
    }

Ответ 4

MyObject obj= (MyObject)((Button)e.Source).DataContext;

Ответ 5

Если ваш DataGrid DataContext является объектом DataView (свойство DefaultView для DataTable), вы также можете сделать это:

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