Это нормальное поведение, поскольку элемент управления прослушивает только INotifyPropertyChanged
, а не ICollectionChanged
. Само свойство коллекции не изменяется, и поэтому элемент управления не знает, что он должен обновлять.
Чтобы передать изменения коллекции в элемент управления, вам необходимо подписаться на ваше ObservableCollection
событие CollectionChanged
, а затем вызвать событие изменения свойства для свойства коллекции при изменении коллекции (добавленные элементы, удалены, перемещены или коллекция очищена).
#region [BViewModelCollection]
/// <summary>
/// The <see cref="BViewModelCollection" /> property's name.
/// </summary>
public const string BViewModelCollectionPropertyName = "BViewModelCollection";
private ObservableCollection<BViewModel> _bViewModelCollection = new ObservableCollection<BViewModel>();
/// <summary>
/// Gets the BViewModelCollection property.
/// TODO Update documentation:
/// Changes to that property's value raise the PropertyChanged event.
/// This property's value is broadcasted by the Messenger's default instance when it changes.
/// </summary>
public ObservableCollection<BViewModel> BViewModelCollection {
get {
return _bViewModelCollection;
}
set {
if (_bViewModelCollection != value) {
SetBViewModelCollection(value);
RaisePropertyChanged(BViewModelCollectionPropertyName);
}
}
}
private void SetBViewModelCollection(ObservableCollection<BViewModel> value) {
if (_bViewModelCollection != null)
_bViewModelCollection.CollectionChanged -= this.BViewModelCollection_CollectionChanged;
_bViewModelCollection = value;
if (_bViewModelCollection != null)
_bViewModelCollection.CollectionChanged += this.BViewModelCollection_CollectionChanged;
}
private void BViewModelCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) {
RaisePropertyChanged(BViewModelCollectionPropertyName);
}
#endregion
Теперь вы можете использовать SetBViewModelCollection
, чтобы установить ObservableCollection
и автоматически правильно зарегистрировать события, не вызывая событие PropertyChanged
для коллекции - например, для использования в конструкторе или методе загрузки данных.
Когда элемент добавляется в коллекцию или удаляется из нее, ваш элемент управления должен получать уведомление об изменении свойства коллекции.
Примечание : настроить имена методов в соответствии с вашей собственной структурой.