Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] Eliminar Item en un ListView en WPF desde un boton

Estas en el tema de Eliminar Item en un ListView en WPF desde un boton en el foro de .NET en Foros del Web. Buenas noches . Tengo un ListView en WPF donde lo lleno con información apartir de lo que se captura en un formulario. Quisiera saber como ...
  #1 (permalink)  
Antiguo 08/10/2015, 20:39
 
Fecha de Ingreso: mayo-2014
Ubicación: Monterrey
Mensajes: 18
Antigüedad: 9 años, 11 meses
Puntos: 0
Exclamación Eliminar Item en un ListView en WPF desde un boton

Buenas noches .
Tengo un ListView en WPF donde lo lleno con información apartir de lo que se captura en un formulario.
Quisiera saber como puedo eliminar un item seleccionado en mi listview
Lo intente de la siguiente manera
listview.items.remove(listview.selecteditem);
Pero me arroja "Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead
Soy nuevo en WPF espero me puedan apoyar .
Gracias
  #2 (permalink)  
Antiguo 08/10/2015, 23:09
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 3 meses
Puntos: 52
Respuesta: Eliminar Item en un ListView en WPF desde un boton

El error es claro.

Como te dije anteriormente, la forma correcta de trabajar en WPF es operar contra los datos, y NO contra la UI. Si estás usando una colección como ItemsSource del ListView, entonces deberías eliminar el item de la colección y no del ListView. El ListView solo cumple la función de mostrar la información, y no contenerla.

Para que esto funcione necesitás usar una ObservableCollection<T> en lugar de un List<T> o algun otro tipo de lista / collection. La ObservableCollection implementa System.ComponentModel.INotifyCollectionChanged y reporta los cambios que ocurran en la misma (agregar / quitar / reordenar elementos) mediante el evento CollectionChanged. WPF captura este evento y actualiza la UI de manera automática.

Te sugiero nuevamente que leas el artículo de MSDN que te había indicado anteriormente. Podés seguir trabajando incorrectamente si querés, pero lo único que vas a lograr es perder una cantidad enorme de tiempo. Trabajar de forma correcta en WPF es mas fácil que tratar de hacer que funcionen las malas prácticas que venís arrastrando de otras tecnologías.
  #3 (permalink)  
Antiguo 08/10/2015, 23:18
 
Fecha de Ingreso: mayo-2014
Ubicación: Monterrey
Mensajes: 18
Antigüedad: 9 años, 11 meses
Puntos: 0
Respuesta: Eliminar Item en un ListView en WPF desde un boton

Muchas gracias , si e hice modificaciones , y logre solucionarle como me lo comentas , es que me respondieron en otra parte y efectivamente es asi ObservableCollection

private ObservableCollection<string> collection;

Buenas noches y gracias
  #4 (permalink)  
Antiguo 08/10/2015, 23:46
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 3 meses
Puntos: 52
Respuesta: Eliminar Item en un ListView en WPF desde un boton

Mira, te hice un ejemplo rápido para que veas como hacer esto usando DataBinding en WPF:

1 - Primero creamos una clase que implemente INotifyPropertyChanged (*1):

Código C#:
Ver original
  1. using System.ComponentModel;
  2.     using System.Runtime.CompilerServices;
  3.    
  4.     public class PropertyChangedBase : INotifyPropertyChanged
  5.     {
  6.         public event PropertyChangedEventHandler PropertyChanged;
  7.  
  8.         public void OnPropertyChanged([CallerMemberName]string propertyName = "")
  9.         {
  10.             var handler = this.PropertyChanged;
  11.             if (handler != null)
  12.                 handler(this, new PropertyChangedEventArgs(propertyName));
  13.         }
  14.     }

2 - Luego definimos nuestro modelo de datos a partir de esta clase base :

Código C#:
Ver original
  1. public class Person: PropertyChangedBase
  2.     {
  3.         private string _firstName;
  4.         public string FirstName
  5.         {
  6.             get { return _firstName; }
  7.             set
  8.             {
  9.                 _firstName = value;
  10.                 OnPropertyChanged();
  11.             }
  12.         }
  13.  
  14.         private string _lastName;
  15.         public string LastName
  16.         {
  17.             get { return _lastName; }
  18.             set
  19.             {
  20.                 _lastName = value;
  21.                 OnPropertyChanged();
  22.             }
  23.         }
  24.     }

3 - Creamos un ViewModel que contenga la collection de Person, y una propiedad SelectedPerson que representa el elemento seleccionado de la lista:

Código C#:
Ver original
  1. public class ViewModel: PropertyChangedBase
  2.     {
  3.         public ObservableCollection<Person> People { get; private set; }
  4.  
  5.         private Person _selectedPerson;
  6.         public Person SelectedPerson
  7.         {
  8.             get { return _selectedPerson; }
  9.             set
  10.             {
  11.                 _selectedPerson = value;
  12.                 OnPropertyChanged();
  13.             }
  14.         }
  15.  
  16.         public ViewModel()
  17.         {
  18.             var people = new[]
  19.             {
  20.                 new Person { FirstName = "Juán", LastName = "Pérez" },
  21.                 new Person { FirstName = "Ricardo", LastName = "Gómez" },
  22.                 new Person { FirstName = "Susana", LastName = "Gutierrez" }
  23.             };
  24.  
  25.             this.People = new ObservableCollection<Person>(people);
  26.             this.SelectedPerson = this.People.First();
  27.         }
  28.     }

4 - Asignamos una instancia de esta clase al DataContext de la vista, y agregamos los handlers del click de los botones para agregar y quitar elementos:

Código C#:
Ver original
  1. public partial class MainWindow : Window
  2.     {
  3.         public MainWindow()
  4.         {
  5.             InitializeComponent();
  6.             this.DataContext = new ViewModel();
  7.         }
  8.  
  9.         private void Agregar_Click(object sender, RoutedEventArgs e)
  10.         {
  11.             var vm = this.DataContext as ViewModel;
  12.             vm.People.Add(new Person { LastName = "[Apellido]", FirstName = "[Nombre]" });
  13.         }
  14.  
  15.         private void Quitar_Click(object sender, RoutedEventArgs e)
  16.         {
  17.             var vm = this.DataContext as ViewModel;
  18.             if (vm.SelectedPerson != null)
  19.             {
  20.                 vm.People.Remove(vm.SelectedPerson);
  21.             }
  22.         }
  23.     }

5 - Finalmente algo de XAML:

Código XAML:
Ver original
  1. <Window x:Class="WpfApplication2.MainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         Title="MainWindow" Height="350" Width="525">
  5.     <Grid>
  6.         <Grid.RowDefinitions>
  7.             <RowDefinition Height="Auto"/>
  8.             <RowDefinition Height="Auto"/>
  9.             <RowDefinition/>
  10.         </Grid.RowDefinitions>
  11.  
  12.         <Grid.ColumnDefinitions>
  13.             <ColumnDefinition Width="Auto"/>
  14.             <ColumnDefinition/>
  15.             <ColumnDefinition Width="Auto"/>
  16.         </Grid.ColumnDefinitions>
  17.        
  18.         <Label Content="Nombre:" Grid.Row="0" Grid.Column="0"/>
  19.         <Label Content="Apellido:" Grid.Row="1" Grid.Column="0"/>
  20.  
  21.         <TextBox Text="{Binding SelectedPerson.FirstName}" Grid.Row="0" Grid.Column="1" Margin="3"/>
  22.         <TextBox Text="{Binding SelectedPerson.LastName}" Grid.Row="1" Grid.Column="1" Margin="3"/>
  23.        
  24.         <Button Content="Agregar" Grid.Row="0" Grid.Column="2" Margin="3" Click="Agregar_Click"/>
  25.         <Button Content="Quitar" Grid.Row="1" Grid.Column="2" Margin="3" Click="Quitar_Click"/>
  26.  
  27.         <ListView ItemsSource="{Binding People}"
  28.                   SelectedItem="{Binding SelectedPerson}"
  29.                   Grid.Row="2" Grid.ColumnSpan="3">
  30.             <ListView.View>
  31.                 <GridView>
  32.                     <GridViewColumn Header="Nombre" DisplayMemberBinding="{Binding FirstName}" Width="200"/>
  33.                     <GridViewColumn Header="Apellido" DisplayMemberBinding="{Binding LastName}" Width="200"/>
  34.                 </GridView>
  35.             </ListView.View>
  36.         </ListView>
  37.     </Grid>
  38. </Window>

Fijate que al seleccionar items en la lista, se populan automáticamente los TextBox, y al cambiar el texto en los textbox se actualizan los datos en el ListView, y TODO sin escribir una línea de código, sino que WPF lo hace automáticamente mediante DataBinding.

Probá este código y te vas a dar cuenta.

(*1) Esto lo trae cualquier MVVM Framework como Caliburn.Micro, MVVM Light, MVVMCross, Prism, etc. etc. Muchas personas sugieren que siempre se debe usar uno de estos frameworks para crear aplicaciones en WPF, yo personalmente me he creado uno propio tomando cosas de cada uno de ellos.

Etiquetas: c#, listview, wpf
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:37.