Hoy me he encontrado un caso “complejo” cuya solución como casi siempre es muy sencilla.
Escenario:
Tenemos una lista “ListBox” en la que establecemos una plantilla “DataTemplate” para los elementos de la lista “ListBoxItem”. Dentro de la plantilla ponemos un botón que queremos que realice una acción diferente a la que realice la selección de un elemento de la lista.
En este caso, seleccionar un elemento de la lista realizará la acción de centrarnos en el punto correspondiente en el mapa y el botón con la flecha, nos debe enviar a otra página pasando los datos del elemento de la lista.
Estos datos están enlazados mediante el ItemSource de la lista a una colección del tipo “List<TipoEnlazado>”, así que… en el caso de la selección de un elemento de la lista es fácil, sólo hay que obtener el contexto y hacer un cast al Tipo que se enlazó. En el caso del botón… PROBLEMA
private void Pushpin_Tap(object sender, System.Windows.Input.GestureEventArgs e) { var pushpin = sender as Pushpin; TipoEnlazado variable = (TipoEnlazado)pushpin.DataContext; // TODO: Aquí pondremos nuestro código }
Problema:
Por lo que parece, desde el botón no podemos sacar el contexto (tan fácilmente) como podríamos hacer del elemento de lista “ListBoxItem”, así que… me tocó investigar y usar ese “gran y veloz” método de… prueba – error – traza.
Solución:
Bueno, como podréis observar, lo que tendremos que hacer es convertir el “sender” al tipo de control “Button” y, de ahí, sacar el contexto que tendremos que convertir en nuestro tipo enlazado. Con esto… problema resuelto, ya podemos realizar nuestras operaciones con los datos del elemento y enviarlos a la siguiente ventana.
private void btnPlace_Click(object sender, System.Windows.RoutedEventArgs e) { TipoEnlazado item = (sender as Button).DataContext as TipoEnlazado; ListBoxItem pressedItem = this.lstSearchResult.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem; //TODO: Aquí pondremos nuestro código }
Además, como se puede observar entre todas mis pruebas conseguí encontrar un medio de saber a qué elemento de la lista pertenece el botón pulsado gracias a lstSearchResult.ItemContainerGenerator.ContainerFromItem(item)
Bueno, esto es todo. Espero que le sirva a alguien.