MVVM,多维属性,反映元素的变化

MVVM,多维属性,反映元素的变化,mvvm,observablecollection,Mvvm,Observablecollection,我有一个MVVM风格的应用程序。其中有一个自定义控件,其依赖属性包含a的ObservableCollection。a的ObservableCollection为B。a和B实现INotifyPropertyChanged 在ViewModel中将B对象添加到A时,更改不会传播到控件。xaml中的绑定是正确的,因为Bs是显示的,模式是双向的。这是正常的行为,因为控件只侦听INotifyPropertyChanged,而不侦听ICollectionChanged。集合属性本身不会更改,因此,控件不知道

我有一个MVVM风格的应用程序。其中有一个自定义控件,其依赖属性包含a的ObservableCollection。a的ObservableCollection为B。a和B实现INotifyPropertyChanged


在ViewModel中将B对象添加到A时,更改不会传播到控件。xaml中的绑定是正确的,因为Bs是显示的,模式是双向的。

这是正常的行为,因为控件只侦听
INotifyPropertyChanged
,而不侦听
ICollectionChanged
。集合属性本身不会更改,因此,控件不知道必须刷新

为了将集合更改传递给控件,您必须订阅您的
ObservableCollection
事件,然后在集合更改(添加、删除、移动项目或清除集合)时引发集合属性的属性更改事件

#区域[BViewModelCollection]
/// 
///该属性的名称。
/// 
公共常量字符串BViewModelCollectionPropertyName=“BViewModelCollection”;
私有ObservableCollection_bViewModelCollection=新ObservableCollection();
/// 
///获取BViewModelCollection属性。
///TODO更新文档:
///更改该属性的值将引发PropertyChanged事件。
///此属性的值在更改时由Messenger的默认实例广播。
/// 
公共可观测集合BViewModelCollection{
得到{
返回_bViewModelCollection;
}
设置{
if(_bViewModelCollection!=值){
SetBViewModelCollection(值);
RaisePropertyChanged(BViewModelCollectionPropertyName);
}
}
}
私有ViewModelCollection(ObservableCollection值){
if(_bViewModelCollection!=null)
_bViewModelCollection.CollectionChanged-=此.bViewModelCollection\u CollectionChanged;
_bViewModelCollection=值;
if(_bViewModelCollection!=null)
_bViewModelCollection.CollectionChanged+=此.bViewModelCollection\u CollectionChanged;
}
私有void BViewModelCollection_CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e){
RaisePropertyChanged(BViewModelCollectionPropertyName);
}
#端区
现在,您可以使用
SetBViewModelCollection
设置
ObservableCollection
并自动正确注册事件,而无需引发集合的
PropertyChanged
事件,例如用于构造函数或加载数据方法

现在将项添加到集合或从集合中移除时,您的控件应收到集合属性已更改的通知


注意:根据您自己的框架调整方法名称。

非常感谢您的快速响应!我要试试看!
#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