sirve que para wpf data-binding listbox observablecollection

wpf - para que sirve observablecollection c#



¿Una mejor forma de obligar a WPF ListBox con datos a actualizarse? (7)

Es posible que tenga un problema similar al que está teniendo, pero no estoy seguro.

Tenía un ObservableCollection<MyEntity> y un ListBox vinculado a él. Pero por alguna extraña razón, mi ListBox no se actualizaba cuando cambié las propiedades de los objetos MyEntity en la lista.

Después de buscar por un tiempo, encontré la siguiente página y solo tenía que informarte:

http://www.wblum.org/listbind/net3/index.html

Es una muy buena descripción de lo que debe hacer para que un ListBox actualice cuando la lista o los objetos que contiene cambien. Esperando que se beneficie de esto.

Tengo WPF ListBox que está vinculado a un ObservableCollection, cuando la colección cambia, todos los elementos actualizan su posición.

La nueva posición se almacena en la colección, pero la IU no se actualiza. Entonces agregué lo siguiente:

void scenarioItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { ToolboxListItem.UpdatePositions(); lstScenario.ItemsSource = null; lstScenario.ItemsSource = ToolboxListItem.ScenarioItems; this.lstScenario.SelectedIndex = e.NewStartingIndex; }

Al establecer ItemsSource nulo y luego volver a vincularlo, la interfaz de usuario se actualiza,

pero esta es probablemente una codificación muy mala: p

Sugerencias?


Esto es algo antiguo, pero usa un ObservableCollection. Si desea que la UI vea las actualizaciones de las propiedades en los Objetos de ObservableCollection, debe implementar INotifyPropertyChanged en la defensa de la clase para ese objeto. A continuación, plantee el evento de propiedad modificada en el establecimiento de cada propiedad.

Public Class Session Implements INotifyPropertyChanged Public Event PropertyChanged As PropertyChangedEventHandler _ Implements INotifyPropertyChanged.PropertyChanged Private Sub NotifyPropertyChanged(ByVal info As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info)) End Sub Private _name As String = "No name" '''''' <summary> '''''' Name of Session '''''' </summary> '''''' <value></value> '''''' <returns></returns> '''''' <remarks></remarks> Public Property Name() As String Get Return _name End Get Set(ByVal value As String) _name = value NotifyPropertyChanged("Name") End Set End Property


Para mí, parece más un error en ListBox y ListView. Estoy vinculando a una ObservableCollection, los elementos de la colección implementan INotifyPropertyChanged. La interfaz de usuario no muestra elementos agregados cuando presiono dinámicamente el botón "agregar elemento"; sin embargo, tengo un control de contador que está vinculado a MyCollection.Count. Este control de contador se incrementa cada vez que presiono mi botón ''agregar elemento''. Si cambio el tamaño de la vista, el cuadro de lista muestra todos mis elementos agregados. Por lo tanto, el enlace de ItemSource en el control ListBox está roto. También tuve cuidado de no crear una nueva MyCollection en ningún momento, lo que rompería el enlace. Boo hoo.


Si tiene una Lista observable de objetos y está cambiando las propiedades dentro de esos objetos, la notificación no se aplica ya que la colección no está cambiando directamente. He estado forzando la notificación después de cambiar las propiedades de mis objetos usando Insertar () para volver a agregar mi objeto cambiado a la colección, luego RemoveAt () para eliminar la copia anterior. No es bonito, pero funciona.


Tengo un Listbox vinculado a una propiedad de objeto que es de tipo List<MyCustomType>() y verifiqué que el siguiente código actualiza el listbox cuando se actualiza la lista.

void On_MyObjProperty_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { MyListBox.Items.Refresh(); }

Si aún tiene problemas, explore la ventana de salida de VS IDE (Ctrl + W, O) y vea si puede detectar los errores de enlace informados.


Tuve el mismo problema ayer, y es una mierda completa :) ... No voy a establecer el mío para nulo más sin embargo. En mi caso, lo estoy configurando en MyList.ToArray () (después de cada vez que lo agregue a la lista).

He visto múltiples "oh, necesitas usar una Lista observable" <- mierda completa.

He visto varios "oh, llame a ''Refresh''" <- completa mierda.

Por favor perdone mi malestar, pero también espero que esto funcione :)


WPF vincula una lista / colección de elementos a un ListBox, pero la UI no se actualiza después de que se actualicen los elementos, Resuelto .

Solo soy estúpido. Mientras que había leído mucho sobre el uso de ObservableCollection<> lugar de List<> , simplemente seguí ignorando esta sugerencia y seguí otras sugerencias, sin éxito. Volví a mis libros y volví a leer. Está bastante bien explicado que ObservableCollection<> es un uso obligatorio porque List<> no proporciona la interfaz INotifyCollectionChange necesaria para que el ListBox actualice su visualización cuando los elementos cambian en la colección.

Este es el código actualizado:

private ObservableCollection<StringWrapper> m_AppLog; ObservableCollection<StringWrapper> Log { get { return m_AppLog; } }

Bastante simple, y no requiere nada más (por ejemplo, Refresh ()). Debido a que ObservableCollection se ocupa de desencadenar el evento de cambio, pude eliminar la llamada innecesaria:

// notify bound objects OnPropertyChanged("Log");

ObservableCollection no admite una actualización por un hilo que no lo creó. Debido a que mi lista (un registro visual para mostrar los mensajes recientes de errores / información) se puede actualizar desde diferentes hilos, agrego para ajustar mi código de esta manera para asegurar que la actualización se realizó con el despachador de la lista:

public void AddToLog(string message) { if (Thread.CurrentThread != Dispatcher.Thread) { // Need for invoke if called from a different thread Dispatcher.Invoke( DispatcherPriority.Normal, (ThreadStart)delegate() { AddToLog(message); }); } else { // add this line at the top of the log m_AppLog.Insert(0, new StringWrapper(message)); // ...

También tenga en cuenta que ObservableCollection<> no es compatible con RemoveRange() diferencia de List<> . Esto es parte de los posibles ajustes necesarios al cambiar de List a ObservableCollection.