Saltar al contenido

Obtener el elemento actual haciendo clic en el botón dentro de un ListView (Xamarin.Forms)

Necesitamos tu apoyo para compartir nuestras crónicas en referencia a las ciencias de la computación.

Solución:

En principio, creo que la respuesta dada por @Krzysztof Skowronek es correcta, simplemente intentaré profundizar en ella y evitaré el uso de ViewModel ya que parece que no lo está usando (aunque el uso es una Mejor Práctica en Xamarin Forms ).

Siguiendo su propio código, escribí el siguiente código en XAML:




    
        
            
                
                    
                        

Acerca de esta parte de la solución, daría los siguientes comentarios:

  • Tenga en cuenta el uso de ConntentPage en lugar de ListView en la parte superior de XAML, ¿es intencional?

  • Luego, observe la adición de x: Name en ListView. Se utilizará para comunicarse con ListView desde el código subyacente.

  • Además, observe el uso de HasUnevenRows establecido en True. Esto hace que ListView ajuste automáticamente la altura de las filas.

  • Finalmente, vea que en Button he configurado el evento Clicked en “Eliminar”, que es el nombre del controlador de eventos en el código subyacente, como verá.

En el código detrás escribí:

using System;
using System.Collections.ObjectModel;
using Xamarin.Forms;

namespace DeleteButton

    public partial class MainPage : ContentPage
    
        ObservableCollection list;

        public MainPage()
        
            InitializeComponent();
        

        protected override void OnAppearing()
        
            base.OnAppearing();

            list = new ObservableCollection()
            
                "Task 1", "Task 2", "Task 3", "Task 4", "Task 5",
                "Task 6", "Task 7", "Task 8", "Task 9", "Task 10"                    
            ;

            listView.ItemsSource = list;
        

        public void Delete(Object Sender, EventArgs args)
        
            Button button = (Button)Sender;
            StackLayout listViewItem = (StackLayout)button.Parent;
            Label label = (Label)listViewItem.Children[0];

            String text = label.Text;

            list.Remove(text);
        
    

Allí defino la lista de cadenas como ObservableCollection (ObservableCollection hace que ListView reciba una notificación cada vez que cambia, de modo que ListView actualiza su contenido, consulte el documento para obtener más detalles).

Luego configuro la propiedad ItemSource de ListView en la colección de Strings, como ya lo hizo.

Finalmente viene EventHandler Delete, llamado por el evento Click en Button, en XAML. El algoritmo aquí es bastante simple:

Primero, el remitente se envía a un botón (sabemos que el objeto que dispara el evento es un botón).

Luego caminamos por el árbol de jerarquía hasta el StackLayout que contiene el Botón y la Etiqueta y recuperamos el primer elemento secundario, que sabemos que es la Etiqueta.

Una vez que tenemos la etiqueta, recuperamos su propiedad Text y llamamos al método Remove de la colección para obtener el viaje de ese elemento.

Y eso es.

Nota: Si implementara esta funcionalidad yo mismo, preferiría definir una colección de objetos que contendría una propiedad Text así como una propiedad Id para eliminar exactamente el elemento seleccionado. En el código anterior, si la colección contiene dos cadenas idénticas, EventHandler iría simplemente para la primera aparición.

Espero que esto le ayude a encontrar la forma correcta de resolver su problema.

Si no desea utilizar los comandos, puede utilizar el evento Clicked del botón. ES DECIR,

Luego, en su código detrás del archivo,

private void HandleDeleteButtonClicked(object sender, EventArgs e)

    // Assuming your list ItemsSource is a list of strings
    // (If its a list of some other type of object, just change the type in the (cast)):
    var stringInThisCell = (string)((Button)sender).BindingContext;

    // Now you can delete stringInThisCell from your list.
    myList.Remove(stringInThisCell);

Si estamos dispuestos a mantener el enfoque MVVM, entonces en su Vista, nombre el ContentPage (o cualquier elemento raíz que esté allí) y utilícelo como Origen para enlazar el comando:




   
      
         
            
               
                  

y en su ViewModel, defina el comando ‘AcceptRequestCommand’.

Recuerda que te brindamos la opción de comentar si diste con la contestación.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *