6.02.2009

Seleccionando un Ítem en el DataGrid del WPF Toolkit

En un post anterior, mostramos como ligar el DataGrid del WPF toolkit a una colección de entidades generadas en el entity framework vía una capa de lógica de negocios. En este post vamos a obtener la fila seleccionada en el grid por parte del usuario y lo vamos a desplegar en una ventana en modo diálogo.

En este caso, vamos a presentar el usuario seleccionado con doble clic del mouse sobre el registro deseado en el DataGrid del toolkit de WPF. Pero antes de llevar a cabo esta tarea, tenemos que preparar la pantalla en la cual vamos a presentar los detalles del usuario. Para este ejemplo, vamos a utilizar la pantalla DetalleUsuario.xaml utilizada también en un post anterior para agregar usuarios a la base de datos. 

Lo primero que vamos a hacer es crear un constructor en la pantalla que me permita recibir el usuario como parámetro para poder desplegarlo. Una vez recibida la entidad usuario, procedemos a asignarlo a cada uno de los componentes que representan los atributos de la entidad en la pantalla – existen varias formas de hacer databinding en WPF, en este caso vamos a usar la que a mi criterio es la más simple de entender, en post posteriores vamos a ver las diferentes formas de hacer databinding en WPF. El código para llevar a cabo esta tarea es el siguiente:

public DetalleUsuario( )
{
InitializeComponent( );
}

public DetalleUsuario( Usuario usuario )
{
InitializeComponent( );
txtNombre.Text = usuario.Nombre;
txtApellido1.Text = usuario.Apellido1;
txtApellido2.Text = usuario.Apellido2;
txtEmail.Text = usuario.Email;

}



Seguidamente vamos a crear un manejador para el evento doble clic del DataGrid de usuarios en la pantalla AdministracionDeUsuarios.xaml. Para llevar a cabo esta tarea, marcamos el grid, vamos a las propiedades del mismo, y seleccionamos el botón con un ícono de rayo en el tool bar de las propiedades, esto presentará los eventos disponibles del control. Por último buscamos el evento MouseDoubleClick y le damos doble click para que genere el manjeador del evento automáticamente.



image



Una vez generado el handler del evento procedemos a codificar la selección del ítem y la invocación de la pantalla que presenta el detalle del ítem seleccionado.



private void dgUSuarios_MouseDoubleClick( object sender, System.Windows.Input.MouseButtonEventArgs e )
{
Usuario usuarioSeleccionado = dgUSuarios.SelectedItem as Usuario;
DetalleUsuario detalle = new DetalleUsuario(usuarioSeleccionado);
detalle.ShowDialog( );
}


Como podemos ver en el código anterior, la propiedad del grid que nos devuelve el row seleccionado es SelectedItem. En esta misma línea convertimos la fila seleccionada al tipo del objeto que queremos obtener, esto con el operador as.  Este operador tiene la ventaja de que trata de convertir la fila al objeto seleccionado, y si no puede llevar a cabo la conversión, establece la variable usuarioSeleccionado con un valor de null. En este caso la conversión se va a dar, dado que el datagrid esta ligado a una colección – lista – de entidades de usuario. Por último creamos la instancia de la forma donde vamos a presentar el detalle, pero utilizamos el constructor que acabamos de crear, pasándole el usuario obtenido de la selección del Datagrid. Para finalizar, presentamos la pantalla con el detalle.



image







9 comentarios:

Unknown dijo...

Me ha encantado tu serie de articulas acerca del datagrid, pero tengo una duda que quizá tu puedas contestarme al realizar cambios sobre el datagrid (agregar una fila nueva por ejemplo)estos cambios quedan registrados en el datacontext pero hay algun evento que se genere? aparte del RowEditEnding que yo pueda capturar para decirle al entitymodel que actualice sobre la base de datos.
Estos cambios sobre el datacontext del datagrid no generan eventos?, debería crear mi propia colección observable

Luis D. Rojas dijo...

Tal vez te refieres al evento DataContextChanged? en este link puedes ver la información de ese evento.
WPFDataGrid DataContextChanged

Anónimo dijo...

oa mira sabes yo quiero seleccionar un item pero lo quiero q aparescan en el textbox del mismo formulario nada mas no se como puedo hacer eso porq lo ize con lo q tu as indicado en tu block pero no puedo te agradeceria la informacion

Luis D. Rojas dijo...

Gracias por leer mi blog
Si lo que obtienes del Grid es una instancia de un objeto, pues debes acceder el objeto obtenido del grid directamente desde la propiedad que deseas acceder.
ej:
TextBox1.Text = MiObjeto.Propiedad;

Saludos

Jmtt dijo...

disculpa con esto puedo ver el contenido del objeto, pero no modificarlo, como podria hacer en el caso de que desee q me abra la ventana de detallaUsuario y despues de modificar algun campo de Aceptar y se modifique????

Anónimo dijo...

Hola me quede en esta entrada cual es la siguiente?

Anónimo dijo...

Hola vengo siguiendo "El Entity Framework en una Arquitectura n-Layer" pero me quedé en esta entrada con cual debo seguir?

Anónimo dijo...

Buen dia.
Esta linea no me funciona en VS2015 update3:
Usuario usuarioSeleccionado = dgUSuarios.SelectedItem as Usuario;

usuarioSeleccionado queda en null.
Lo estoy haciendo de una manera muy diferente con ItemArray
DataRowView item = DG.SelectedItem as DataRowView;
_contacto.Nombre = item.Row.ItemArray[0].ToString();
.
.
.

Si tienes alguna forma diferente de hacerlo y que funcione en VS2015 se agradece. Se que este post es bantante viejo.

Estoy buscando como obtener el valor de una celda del DataGrid en WPF y llegue hasta aqui. Si sabes como obtener dicho valor tambien se te agradece.

Unknown dijo...

gracias!