ObservableCollection - не единственная коллекция, которую вы можете использовать в wpf. Но это стандартная коллекция позволяет wpf автоматически обновлять контейнеры элементов пользовательского интерфейса, такие как ListBox, при изменениях коллекции, таких как добавление или удаление элемента. Вы не можете сделать это с помощью List.
Когда пользователь изменяет текстовое поле в ListBoxItem, коллекция ObservableCollection не обновляется, поскольку вы не добавляете, не удаляете и не переупорядочиваете элементы в коллекции. Вы изменяете свойство в одном из пунктов.
ListBox содержит список контейнеров ListBoxItem, по одному для каждого элемента в коллекции, указанной как ItemsSource.
DataContext каждого ListBoxItem устанавливается на соответствующий элемент, хранящийся в ObservableCollection. Таким образом, если вы измените текст в TextBox в коде, механизм привязки изменит свойство этого элемента, указанное для TextBox.Text в привязке. Ничего не нужно изменять или обновлять для объекта ObservableCollection.
В установщике свойства такого элемента обычно вызывается событие PropertChanged интерфейса INotifyPropertyChanged. Это также обычное место для установки грязного флага. Затем вы также можете сразу же зафиксировать изменения, сохранить список грязных объектов или найти их при фиксации, например:
items.Where(item => item.IsDirty)
Также есть хорошие инструменты, такие как Snoop и WPFInspector, которые очень помогают вам понять визуальное дерево приложения wpf и текстовые данные для каждого элемента