Если ваш проблема не решена, а затем замените файл резервным файлом.
У меня есть Listbox, связанный со свойством объекта, которое имеет тип List<MyCustomType>()
, и я убедился, что следующий код обновляет список при обновлении List.
void On_MyObjProperty_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
MyListBox.Items.Refresh();
}
Если проблемы все еще возникают, отсканируйте окно вывода VS IDE (Ctrl + W, O) и посмотрите, сможете ли вы обнаружить какие-либо сообщения об ошибках привязки.
У меня может быть та же проблема, что и у вас, но я не уверен.
У меня были ObservableCollection<MyEntity>
и ListBox
, связанные с ним. Но по какой-то странной причине мой ListBox
не обновлялся, когда я изменил свойства MyEntity
объектов в списке.
После поиска я нашел следующую страницу, и мне просто пришлось сообщить вам:
http://www.wblum.org/listbind/net3/index.html
Это очень хорошее описание того, что вы должны сделать, чтобы получить ListBox
для обновления при изменении списка или объектов в нем. Надеюсь, что вы выиграете от этого.
WPF привязывает список / коллекцию элементов к ListBox, но пользовательский интерфейс не обновляется после обновления элементов, Решено .
1114 Я просто тупой. Хотя я много читал об использованииObservableCollection<>
вместо List<>
, я просто продолжал игнорировать это предложение и следовал другим предложениям, но безрезультатно. Вернулся к моим книгам и перечитал. Довольно хорошо объяснено, что ObservableCollection<>
является обязательным использованием, потому что List<>
не предоставляет интерфейс INotifyCollectionChange
, необходимый для ListBox
обновления его отображения, когда элементы изменяются в коллекции.
Это обновленный код:
private ObservableCollection<StringWrapper> m_AppLog;
ObservableCollection<StringWrapper> Log { get { return m_AppLog; } }
Довольно просто и не требует ничего другого (например, Refresh ()). Поскольку ObservableCollection заботится о том, чтобы инициировать событие изменения, я смог удалить ненужный вызов:
// notify bound objects
OnPropertyChanged("Log");
ObservableCollection
не поддерживает обновление потоком, который его не создавал. Поскольку мой список (визуальный журнал, отображающий последние сообщения об ошибках / информационные сообщения) можно обновлять из разных потоков, я добавляю его, чтобы настроить свой код таким образом, чтобы обеспечить обновление с помощью собственного диспетчера списка:
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));
// ...
Также отметим, что ObservableCollection<>
не поддерживает RemoveRange()
вопреки List<>
. Это часть возможных корректировок, требуемых при переходе от List к ObservableCollection.
У меня была та же самая проблема вчера, и это полный кусок дерьма :) ... хотя я больше не устанавливаю свой ноль. В моем сценарии я устанавливаю его в MyList.ToArray () (после каждого добавления в список).
Я видел несколько «о, вам нужно использовать ObservableList» < - полная чушь.
Я видел несколько слов «ох, назовите« Обновить »» < - полная чушь.
Прошу простить меня, но я также ожидал, что это сработает :)
Для меня это больше похоже на ошибку в ListBox и ListView. Я привязан к ObservableCollection, элементы в коллекции реализуют INotifyPropertyChanged. Пользовательский интерфейс не показывает добавленные элементы, когда я динамически нажимаю кнопку «Добавить элемент», однако у меня есть счетчик, связанный с MyCollection.Count. Это управление счетчиком увеличивается каждый раз, когда я нажимаю кнопку «Добавить элемент». Если я изменю размер представления, в окне списка отображаются все мои добавленные элементы. Таким образом, привязка ItemSource к элементу управления ListBox нарушена. Я также позаботился о том, чтобы в любой момент не создавать новую коллекцию MyCollection, которая бы нарушила привязку. Бу Ху.
Если у вас есть ObservableList объектов, и вы изменяете свойства внутри этих объектов, уведомление не применяется, поскольку коллекция не изменяется напрямую. Я заставляю уведомление после изменения свойств моего объекта, используя Insert (), чтобы повторно добавить мой измененный объект в коллекцию, затем RemoveAt (), чтобы удалить старую копию. Это не красиво, но работает.
Это старый материал, но используйте ObservableCollection. Если вы хотите, чтобы пользовательский интерфейс видел обновления свойств в объектах ObservableCollection, вам необходимо реализовать INotifyPropertyChanged в определении класса для этого объекта. Затем создайте событие свойства изменено в установщике каждого свойства.
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
Я знаю, что это является уже немного более старым, но сегодня я столкнулся с той же проблемой. Я обновил свойство объекта в ObservableCollection, и Представление не обновило, но затем я нашел этот потрясающая статья.
я думаю, что это - очень чистое решение вручную инициировать обновление ObservableCollection:
CollectionViewSource.GetDefaultView(this.myObservableCollection).Refresh();