Vb.net Inotify更改为其他类或对象
我有一个小问题,我的课程如下Vb.net Inotify更改为其他类或对象,vb.net,inotifypropertychanged,Vb.net,Inotifypropertychanged,我有一个小问题,我的课程如下 Public Class Bill Public prime As BillPrime Public items As System.Collections.ObjectModel.ObservableCollection(Of ItemDetails) Public status As New BillStatus Public Sub New() prime = New BillPrime item
Public Class Bill
Public prime As BillPrime
Public items As System.Collections.ObjectModel.ObservableCollection(Of ItemDetails)
Public status As New BillStatus
Public Sub New()
prime = New BillPrime
items = New System.Collections.ObjectModel.ObservableCollection(Of ItemDetails)
status = New BillStatus
End Sub
End Class
当items
中的任何ItemDetails
对象发生更改时,如何更新prime
中的某些x值
您能帮助我找到解决方案吗?每当ItemDetails类的任何属性发生更改时,该类都需要引发事件。我建议在ItemDetails类上实现INotifyPropertyChanged接口,但您可以实现自己的事件。然后,您需要在将每个ItemDetails.PropertyChanged事件添加到列表中时向其添加事件处理程序,并在从列表中删除每个项目时从中删除该处理程序。例如:
Public Class Bill
Public prime As BillPrime
Public items As System.Collections.ObjectModel.ObservableCollection(Of ItemDetails)
Public status As New BillStatus
Public Sub New()
prime = New BillPrime
items = New System.Collections.ObjectModel.ObservableCollection(Of ItemDetails)
AddHandler items.CollectionChanged, AddressOf items_CollectionChanged
status = New BillStatus
End Sub
Private Sub items_CollectionChanged(sender As Object, e As NotifyCollectionChangedEventArgs)
For Each i as ItemDetails in e.NewItems
AddHandler i.PropertyChanged, AddressOf item_PropertyChanged
Next
For Each i as ItemDetails in e.OldItems
RemoveHandler i.PropertyChanged, AddressOf item_PropertyChanged
Next
End Sub
Private Sub item_PropertyChanged(sender As Object, e As PropertyChangedEventArgs)
'Do work
End Sub
End Class
ItemDetails类需要在其任何属性发生更改时引发事件。我建议在ItemDetails类上实现INotifyPropertyChanged接口,但您可以实现自己的事件。然后,您需要在将每个ItemDetails.PropertyChanged事件添加到列表中时向其添加事件处理程序,并在从列表中删除每个项目时从中删除该处理程序。例如:
Public Class Bill
Public prime As BillPrime
Public items As System.Collections.ObjectModel.ObservableCollection(Of ItemDetails)
Public status As New BillStatus
Public Sub New()
prime = New BillPrime
items = New System.Collections.ObjectModel.ObservableCollection(Of ItemDetails)
AddHandler items.CollectionChanged, AddressOf items_CollectionChanged
status = New BillStatus
End Sub
Private Sub items_CollectionChanged(sender As Object, e As NotifyCollectionChangedEventArgs)
For Each i as ItemDetails in e.NewItems
AddHandler i.PropertyChanged, AddressOf item_PropertyChanged
Next
For Each i as ItemDetails in e.OldItems
RemoveHandler i.PropertyChanged, AddressOf item_PropertyChanged
Next
End Sub
Private Sub item_PropertyChanged(sender As Object, e As PropertyChangedEventArgs)
'Do work
End Sub
End Class
尝试改用
bindingslist(of T)
,然后您可以侦听更改事件:
Imports System.ComponentModel
Public Class Bill
Public prime As BillPrime
Public WithEvents items As BindingList(Of ItemDetails)
Public status As New BillStatus
Public Sub New()
prime = New BillPrime
items = New BindingList(Of ItemDetails)
status = New BillStatus
End Sub
Public Sub items_ListChanged(ByVal sender As Object, ByVal e As ListChangedEventArgs) Handles items.ListChanged
prime.X = "something"
End Sub
End Class
这需要类实现INotifyPropertyChanged
:
Public Class ItemDetails
Implements INotifyPropertyChanged
Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
Private _DetailOne As String
Property DetailOne() As String
Get
Return _DetailOne
End Get
Set(ByVal value As String)
_DetailOne = value
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("DetailOne"))
End Set
End Property
End Class
尝试改用
bindingslist(of T)
,然后您可以侦听更改事件:
Imports System.ComponentModel
Public Class Bill
Public prime As BillPrime
Public WithEvents items As BindingList(Of ItemDetails)
Public status As New BillStatus
Public Sub New()
prime = New BillPrime
items = New BindingList(Of ItemDetails)
status = New BillStatus
End Sub
Public Sub items_ListChanged(ByVal sender As Object, ByVal e As ListChangedEventArgs) Handles items.ListChanged
prime.X = "something"
End Sub
End Class
这需要类实现INotifyPropertyChanged
:
Public Class ItemDetails
Implements INotifyPropertyChanged
Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
Private _DetailOne As String
Property DetailOne() As String
Get
Return _DetailOne
End Get
Set(ByVal value As String)
_DetailOne = value
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("DetailOne"))
End Set
End Property
End Class
啊!!我忘记了绑定列表。我已经有好几年没有这样做了,我记得在走上我建议的事件处理程序之路后,我发现这就是我问题的答案。我总是得到一些新的东西,比如从数组到堆栈,比如列表,然后到可观察的集合,现在我得到了绑定列表,每一个都有自己的特性。谢谢。啊!我忘记了绑定列表。我已经有好几年没有这样做了,我记得在走上我建议的事件处理程序之路后,我发现这就是我问题的答案。我总是得到一些新的东西,比如从数组到堆栈,比如列表,然后到可观察的集合,现在我得到了绑定列表,每一个都有自己的特性。非常感谢。