c# - llenar - personalizar datagrid wpf
WPF DataGrid-Botón en una columna, obteniendo la fila de la que proviene el controlador de eventos Click (5)
Básicamente, su botón heredará el contexto de datos de un objeto de datos de fila. Lo llamo MyObject y espero que MyObject.ID sea lo que usted quería.
private void Button_Click(object sender, RoutedEventArgs e)
{
MyObject obj = ((FrameworkElement)sender).DataContext as MyObject;
//Do whatever you wanted to do with MyObject.ID
}
Establecí el elemento de mi WPF Datagrid en una lista de objetos devuelta desde mi DAL. También agregué una columna adicional que contiene un botón, la xaml está debajo.
<toolkit:DataGridTemplateColumn MinWidth="100" Header="View">
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Click="Button_Click">View Details</Button>
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
Esto rinde bien. Sin embargo, en el método Button_Click , ¿hay alguna manera de obtener la fila en la cuadrícula de datos donde reside el botón? Más específicamente, una de las propiedades de mis objetos es "Id", y me gustaría poder pasar esto al constructor de otro formulario en el controlador de eventos.
private void Button_Click(object sender, RoutedEventArgs e)
{
//I need to know which row this button is on so I can retrieve the "id"
}
Tal vez necesito algo extra en mi xaml, o tal vez estoy hablando de esto de una manera indirecta. Cualquier ayuda / consejo apreciado.
Otra forma en que me gusta hacer esto es vincular el ID a la propiedad CommandParameter del botón:
<Button Click="Button_Click" CommandParameter="{Binding Path=ID}">View Details</Button>
Entonces puedes acceder a él como en el código:
private void Button_Click(object sender, RoutedEventArgs e)
{
object ID = ((Button)sender).CommandParameter;
}
Otra forma que se une al parámetro de comando DataContext y respeta MVVM como Jobi Joy dice que el botón hereda la fila de formulario de contexto de datos.
Botón en XAML
<RadButton Content="..." Command="{Binding RowActionCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}"/>
Implementación del comando
public void Execute(object parameter)
{
if (parameter is MyObject)
{
}
}
Si el DataContext de DataGrid es un objeto DataView (la propiedad DefaultView de una DataTable), también puede hacer esto:
private void Button_Click(object sender, RoutedEventArgs e) {
DataRowView row = (DataRowView)((Button)e.Source).DataContext;
}
MyObject obj= (MyObject)((Button)e.Source).DataContext;