que c# wpf binding listbox observablecollection

c# - que - observablecollection methods



WPF: lista de enlaces a ListBox (5)

Al señalar

NotifyPropertyChanged("bList");

básicamente dice que tiene un nuevo objeto de lista , no que el contenido de la Lista haya cambiado.

Si cambia el tipo a ObservableCollection, las colecciones envían automáticamente

CollectionChanged

notificaciones de que los elementos de la colección han cambiado, que es lo que desea.

Tengo una clase:

public class A : INotifyPropertyChanged { public List<B> bList { get; set; } public void AddB(B b) { bList.Add(b); NotifyPropertyChanged("bList"); } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } }

Y un enlace (DataContext of UserControl es una instancia de A):

<ListBox ItemsSource="{Binding Path=bList}" />

Se muestran los elementos, el ListBox no se actualiza después de que se agrega un nuevo objeto a la Lista

Después de cambiar la lista a ObservableCollection y eliminar el manejador NotifyPropertyChanged todo funciona.

¿Por qué la lista no funciona?


Creo que el problema es que, aunque está notificando al marco vinculante que la propiedad ha cambiado, el valor real de la propiedad sigue siendo el mismo. Es decir, aunque el cuadro de lista puede reevaluar el valor de su enlace ItemsSource, encontrará que sigue siendo la misma instancia de objeto que anteriormente. Por ejemplo, imagine que el recuadro de lista reacciona al evento de propiedad cambiado de alguna manera similar al siguiente.

private void OnItemsSourceBindingChanged() { var newValue = this.EvaluateItemsSourceBinding(); if (newValue != this.ItemsSource) //it will be equal, as its still the same list { this.AddNewItems(); } }

En su ejemplo, esto significaría que no reevaluaría los artículos.

Nota: No cómo funciona el listbox con la propiedad ItemsSource. ¡Solo estoy especulando!


La primera idea es que intentas vincular a un miembro privado. Eso ciertamente no parece correcto.



Su propiedad debe ser public , o el motor de enlace no podrá acceder a ella.

EDITAR:

Después de cambiar la lista a ObservableCollection y eliminar el manejador NotifyPropertyChanged todo funciona.

Esa es precisamente la razón por la cual se introdujo la clase ObservableCollection<T> ... ObservableCollection<T> implementa INotifyCollectionChanged , que le permite notificar a la UI cuando se agrega / quita / reemplaza un elemento. List<T> no desencadena ninguna notificación, por lo que la interfaz de usuario no puede detectar cuándo ha cambiado el contenido de la lista.

El hecho de que levante el evento PropertyChanged actualiza el enlace, pero luego se da cuenta de que es la misma instancia de List<T> que antes, por lo que reutiliza el mismo ICollectionView como ItemsSource , y el contenido del ListBox no se actualiza .