WPF DataGrid-кнопка в столбце, получающая строку, из которой она появилась в обработчике событий Click
Я установил itemsource моего 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, или, может быть, я собираюсь сделать это окольным путем? Любая помощь/совет ценится.
5 ответов:
в основном ваша кнопка наследует datacontext объекта данных строки. Я называю его как объект 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 }
еще один способ, которым мне нравится это делать, - привязать идентификатор к свойству 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; }
другой способ, который привязывается к командному параметру DataContext и уважает MVVM, как Jobi Joy говорит, что кнопка наследует строку формы datacontext.
кнопка в XAML
<RadButton Content="..." Command="{Binding RowActionCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}"/>команда внедрения
public void Execute(object parameter) { if (parameter is MyObject) { } }
Если DataContext вашего DataGrid является объектом DataView (свойство DefaultView объекта DataTable), то вы также можете сделать это:
private void Button_Click(object sender, RoutedEventArgs e) { DataRowView row = (DataRowView)((Button)e.Source).DataContext; }
Comments