Лучший способ заставить привязанный к данным WPF ListBox для обновления?

  1. Откройте папку проекта.
  2. Найдите файл ProjectName.xcodeproj.
  3. Скопируйте и вставьте в безопасное место правой кнопкой мыши.
  4. Нажмите «Показать содержимое пакета».
  5. Найдите файл project.xcworkspace и удалите этот файл.
  6. Повторно запустите проект и очистите и перестройте.

Если ваш проблема не решена, а затем замените файл резервным файлом.

29
задан TimothyP 31 October 2008 в 12:15
поделиться

8 ответов

У меня есть Listbox, связанный со свойством объекта, которое имеет тип List<MyCustomType>(), и я убедился, что следующий код обновляет список при обновлении List.

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

Если проблемы все еще возникают, отсканируйте окно вывода VS IDE (Ctrl + W, O) и посмотрите, сможете ли вы обнаружить какие-либо сообщения об ошибках привязки.

75
ответ дан Gishu 31 October 2008 в 12:15
поделиться

У меня может быть та же проблема, что и у вас, но я не уверен.

У меня были ObservableCollection<MyEntity> и ListBox, связанные с ним. Но по какой-то странной причине мой ListBox не обновлялся, когда я изменил свойства MyEntity объектов в списке.

После поиска я нашел следующую страницу, и мне просто пришлось сообщить вам:

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

Это очень хорошее описание того, что вы должны сделать, чтобы получить ListBox для обновления при изменении списка или объектов в нем. Надеюсь, что вы выиграете от этого.

6
ответ дан kotodev 31 October 2008 в 12:15
поделиться

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.

10
ответ дан rolling 31 October 2008 в 12:15
поделиться

У меня была та же самая проблема вчера, и это полный кусок дерьма :) ... хотя я больше не устанавливаю свой ноль. В моем сценарии я устанавливаю его в MyList.ToArray () (после каждого добавления в список).

Я видел несколько «о, вам нужно использовать ObservableList» < - полная чушь.

Я видел несколько слов «ох, назовите« Обновить »» < - полная чушь.

Прошу простить меня, но я также ожидал, что это сработает :)

4
ответ дан Timothy Khouri 31 October 2008 в 12:15
поделиться

Для меня это больше похоже на ошибку в ListBox и ListView. Я привязан к ObservableCollection, элементы в коллекции реализуют INotifyPropertyChanged. Пользовательский интерфейс не показывает добавленные элементы, когда я динамически нажимаю кнопку «Добавить элемент», однако у меня есть счетчик, связанный с MyCollection.Count. Это управление счетчиком увеличивается каждый раз, когда я нажимаю кнопку «Добавить элемент». Если я изменю размер представления, в окне списка отображаются все мои добавленные элементы. Таким образом, привязка ItemSource к элементу управления ListBox нарушена. Я также позаботился о том, чтобы в любой момент не создавать новую коллекцию MyCollection, которая бы нарушила привязку. Бу Ху.

0
ответ дан flobadob 31 October 2008 в 12:15
поделиться

Если у вас есть ObservableList объектов, и вы изменяете свойства внутри этих объектов, уведомление не применяется, поскольку коллекция не изменяется напрямую. Я заставляю уведомление после изменения свойств моего объекта, используя Insert (), чтобы повторно добавить мой измененный объект в коллекцию, затем RemoveAt (), чтобы удалить старую копию. Это не красиво, но работает.

0
ответ дан 31 October 2008 в 12:15
поделиться

Это старый материал, но используйте 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
2
ответ дан KP. 31 October 2008 в 12:15
поделиться

Я знаю, что это является уже немного более старым, но сегодня я столкнулся с той же проблемой. Я обновил свойство объекта в ObservableCollection, и Представление не обновило, но затем я нашел этот потрясающая статья.

я думаю, что это - очень чистое решение вручную инициировать обновление ObservableCollection:

CollectionViewSource.GetDefaultView(this.myObservableCollection).Refresh();
0
ответ дан 27 November 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: