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