Изменяете ли вы ObservableCollection
при обновлении списка или меняете элементы, хранящиеся в коллекции?
Если вы изменяете элементы внутри коллекции, вам нужно найти способ сообщить WPF, что коллекция изменилась при изменении отдельных элементов, чтобы она могла перерисовать ее.
Обычно элементы в коллекции реализуют INotifyPropertyChanged
, поэтому к элементам в списке легко прикрепить уведомление PropertyChange
, которое сообщает WPF о возникновении события CollectionChanged
при каждом изменении свойства.
// Wireup CollectionChanged in Constructor
public MyViewModel()
{
ListOfSomeItems = new List<SomeItem>();
AssetCollection.CollectionChanged += AssetCollection_CollectionChanged;
}
// In CollectionChanged event, wire up PropertyChanged event on items
void AssetCollection_CollectionChanged(object sender, CollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach(Asset item in e.NewItems)
item.PropertyChanged += Asset_PropertyChanged;
}
if (e.OldItems != null)
{
foreach(Asset item in e.OldItems)
item.PropertyChanged -= Asset_PropertyChanged;
}
}
// In PropertyChanged, raise CollectionChanged event
void Asset_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
OnPropertyChanged("AssetCollection");
}
Если элементы не реализуют INotifyPropertyChanged
, вам придется вручную вызывать событие CollectionChanged
каждый раз, когда элемент в коллекции изменяется.
AssetCollection[0].Thumbnail = new BitmapImage(uri);
OnPropertyChanged("AssetCollection");
Если выизменяя сам ObservableCollection
, добавляя / удаляя элементы и не видя обновления пользовательского интерфейса, тогда это звучит так, как будто это может быть синтаксическая ошибка в том месте, где мы не видимся.
Самым распространенным, что я вижу, является внесение изменений в частную собственность, а не в публичную собственность.
// Will not raise the CollectionChanged notification
_assetCollection = _assetModel.GetAssetThumbnails();
// Will raise the CollectionChanged notification
AssetCollection = _assetModel.GetAssetThumbnails();
Хотя я также вижу много людей, которые используют List
или обычайтакже вместо ObservableCollection
, который не вызывает событие CollectionChanged
.