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