Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当VB.NET中WPF中的可观察集合发生更改时,INotifyPropertyChanged事件未触发_Wpf_Vb.net_Observablecollection_Inotifypropertychanged - Fatal编程技术网

当VB.NET中WPF中的可观察集合发生更改时,INotifyPropertyChanged事件未触发

当VB.NET中WPF中的可观察集合发生更改时,INotifyPropertyChanged事件未触发,wpf,vb.net,observablecollection,inotifypropertychanged,Wpf,Vb.net,Observablecollection,Inotifypropertychanged,我正在尝试使用带有MVVM模式的WPF中的数据绑定。到目前为止,似乎一切都安排妥当了,我使用了正确类型的类和对象。我的可观察集合第一次正确加载,但在数据网格发生更改时不会刷新。可观察集合应该自动实现INPC,我还在基类中为它提供了一个处理程序,所以我不明白为什么它仍然不能工作并更新我的UI。下面是我的代码: ViewModelBase类: #区域“INotifyPropertyChanged成员” 公共事件PropertyChanged为PropertyChangedEventHandler实现

我正在尝试使用带有MVVM模式的WPF中的数据绑定。到目前为止,似乎一切都安排妥当了,我使用了正确类型的类和对象。我的可观察集合第一次正确加载,但在数据网格发生更改时不会刷新。可观察集合应该自动实现INPC,我还在基类中为它提供了一个处理程序,所以我不明白为什么它仍然不能工作并更新我的UI。下面是我的代码:

ViewModelBase类:

#区域“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