当VB.NET中WPF中的可观察集合发生更改时,INotifyPropertyChanged事件未触发
我正在尝试使用带有MVVM模式的WPF中的数据绑定。到目前为止,似乎一切都安排妥当了,我使用了正确类型的类和对象。我的可观察集合第一次正确加载,但在数据网格发生更改时不会刷新。可观察集合应该自动实现INPC,我还在基类中为它提供了一个处理程序,所以我不明白为什么它仍然不能工作并更新我的UI。下面是我的代码: ViewModelBase类:当VB.NET中WPF中的可观察集合发生更改时,INotifyPropertyChanged事件未触发,wpf,vb.net,observablecollection,inotifypropertychanged,Wpf,Vb.net,Observablecollection,Inotifypropertychanged,我正在尝试使用带有MVVM模式的WPF中的数据绑定。到目前为止,似乎一切都安排妥当了,我使用了正确类型的类和对象。我的可观察集合第一次正确加载,但在数据网格发生更改时不会刷新。可观察集合应该自动实现INPC,我还在基类中为它提供了一个处理程序,所以我不明白为什么它仍然不能工作并更新我的UI。下面是我的代码: ViewModelBase类: #区域“INotifyPropertyChanged成员” 公共事件PropertyChanged为PropertyChangedEventHandler实现
#区域“INotifyPropertyChanged成员”
公共事件PropertyChanged为PropertyChangedEventHandler实现INotifyPropertyChanged.PropertyChanged
受保护的可重写子OnPropertyChanged(ByVal propertyName作为字符串)
验证propertyName(propertyName)
Dim处理程序作为PropertyChangedEventHandler=PropertyChangedEvent
如果处理程序不是空的,那么
Dim e=新的PropertyChangedEventArgs(propertyName)
handler(Me,e)
如果结束
端接头
#末端区域
MainWindowViewModel类:
公共类MainWindowViewModel
继承ViewModelBase
私有共享的coreInfoData作为可观察的集合(个人)
公共共享属性CoreInfoData()作为(个人的)可观察集合
得到
返回coreInfoData
结束
设置(ByVal值作为(个人的)可观察集合)
_coreInfoData=值
端集
公用分干管()
如果CoreInfoData不是空的,那么
CoreInfoData.Clear()
如果结束
CoreInfoData=GetRecords()
端接头
GetRecords函数是对数据库的调用,用于获取可用的最新记录集
在我看来,我实际上是绑定到CollectionViewSource并将其绑定到datagrid:
Person
类具有属性LastName
和FirstName
(在许多其他属性中)。据我所知,如果ObservaleCollection本身发生了变化——就像我清除并填充它所做的那样,它应该会自动触发INPC事件,但我的DataGrid似乎不会在第二次刷新。任何想法都会非常有用
谢谢
*编辑*
以下是我最终解决问题的方式:
公共共享属性CoreInfoData()作为(个人的)可观察集合
公共共享属性CoreInfoData()作为(个人的)可观察集合
得到
返回coreInfoData
结束
设置(ByVal值作为(个人的)可观察集合)
如果coreInfoData什么都不是,那么
“获取数据
_coreInfoData=值
其他的
'刷新数据
_coreInfoData.Clear()
对于i=0的值,计数为-1
_coreInfoData.Add(值(i))
下一个
如果结束
端集
端属性
第一次调用Set方法时,它将创建一个新的_coreInfoData变量。随后的调用将替换现有的一个,方法是清除它的全部内容,并循环遍历每个项以将其添加回集合中。
感谢Clemens、Dan Busha和Charleh(以及其他人)的有益评论 不会自动引发PropertyChanged事件,因为属性的类型是
ObservableCollection
。你必须在二传中举起它:
Set(ByVal value As ObservableCollection(Of Person))
_coreInfoData = value
OnPropertyChanged("CoreInfoData")
End Set
仅因为属性的类型是
ObservableCollection
,不会自动引发PropertyChanged事件。你必须在二传中举起它:
Set(ByVal value As ObservableCollection(Of Person))
_coreInfoData = value
OnPropertyChanged("CoreInfoData")
End Set
看起来您正在为ObservaleCollection分配一个值,该值不会更改您的集合,而是会替换它。为CoreInfoData属性引发PropertyChanged事件,或将
集合
值中的项逐个添加到ObservableCollection(ObservableCollection应为您管理PropertyChanged事件的引发).看起来您正在为ObservableCollection分配一个值,该值不会更改您的集合,而是会替换它。为CoreInfoData属性引发PropertyChanged事件,或者将集合
值中的项逐个添加到ObservableCollection(ObservableCollection应该为您管理PropertyChanged事件的引发)。首先-为什么您的集合是共享/静态的
使用ObservableAction时,通常只创建一次实例,然后使用clear、add和remove
如果您想像在setter中那样设置一个新实例,您也必须调用PropertyChanged(“CoreInfoData”)
但我更喜欢清晰和补充
CoreInfoData.Clear()
CoreInfoData.AddRange(GetRecords())
第一-为什么您的收藏是共享/静态的 使用ObservableAction时,通常只创建一次实例,然后使用clear、add和remove 如果您想像在setter中那样设置一个新实例,您也必须调用PropertyChanged(“CoreInfoData”) 但我更喜欢清晰和补充
CoreInfoData.Clear()
CoreInfoData.AddRange(GetRecords())
你把我搞糊涂了
ObservableCollection确实实现了INotifyPropertyChanged,这用于为Count和indexer项[]等属性触发事件。它并没有扩展到您需要它实现的功能。您会感到困惑
ObservableCollection确实实现了INotifyPropertyChanged,这用于为Count和indexer项[]等属性触发事件。它没有扩展到您需要它实现的功能。您确定这是正确的吗?我认为对ObservableCollection本身的更改(例如添加/删除/清除)应该会自动引发更改事件?e、 g.添加/删除/清除将引发一个更改事件,但如果您这样做,
CoreInfoData=new ObservableCollection(…)
,那么您不是在更改现有集合本身,而是在替换它。@Charleh