2012-01-14 2 views
0

MVVM 스타일의 응용 프로그램이 있습니다. ObservableCollectionA를 보유한 종속성 속성이있는 사용자 정의 컨트롤이 있습니다. A에는 ObservableCollectionB가 있습니다. A와 B는 INotifyPropertyChanged를 구현합니다.MVVM, 다차원 속성, 요소 변경 반영

내 ViewModel에서 B의 개체를 A에 추가하면 변경 내용이 컨트롤에 전파되지 않습니다. Bs가 표시되고 Mode가 TwoWay이므로 xaml의 바인딩이 정확합니다.

답변

1

컨트롤은 INotifyPropertyChanged에만 수신되고 ICollectionChanged에는 수신되지 않으므로 정상적인 동작입니다. 컬렉션 속성 자체는 변경되지 않으므로 컨트롤에서 새로 고침해야하는지 여부를 알 수 없습니다.

컬렉션 변경 내용을 컨트롤에 전달하려면 CollectionChanged 이벤트 (예 : ObservableCollection)에 가입 한 다음 컬렉션이 변경되면 컬렉션 속성에 대한 속성 변경 이벤트를 발생시켜야합니다 (항목 추가, 제거, 이동 또는 콜렉션이 지워짐).

#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 

는 이제 컬렉션의 PropertyChanged 이벤트를 발생하지 않고, 제대로 이벤트를 ObservableCollection을 설정하고 자동으로 등록 할 SetBViewModelCollection을 사용할 수 있습니다 - 예를 들어, 생성자 또는로드 데이터 메소드에서 사용합니다.

항목이 컬렉션에 추가되거나 컬렉션에서 제거되면 컨트롤에 컬렉션 속성이 변경되었음을 알려야합니다.

참고 : 메서드 이름을 사용자 고유의 프레임 워크로 조정하십시오.

+0

빠른 응답을 보내 주셔서 감사합니다. 나는 그것을 밖으로 시도 할 것이다! – user1149223