MVVM, многомерное свойство, отражает изменение элемента - PullRequest
0 голосов
/ 14 января 2012

У меня есть приложение в стиле MVVM.Там есть пользовательский элемент управления со свойством зависимости, содержащим ObservableCollection из A. A имеет ObservableCollection из B. A и B реализуют INotifyPropertyChanged.

Когда я добавляю объект B в A в моей ViewModel,Изменения не будут распространены на элемент управления.Привязка в xaml правильная, потому что отображаются B и Mode - TwoWay.

1 Ответ

1 голос
/ 14 января 2012

Это нормальное поведение, поскольку элемент управления прослушивает только 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 для коллекции - например, для использования в конструкторе или методе загрузки данных.

Когда элемент добавляется в коллекцию или удаляется из нее, ваш элемент управления должен получать уведомление об изменении свойства коллекции.

Примечание : настроить имена методов в соответствии с вашей собственной структурой.

...