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

啊!!我忘记了绑定列表。我已经有好几年没有这样做了,我记得在走上我建议的事件处理程序之路后,我发现这就是我问题的答案。我总是得到一些新的东西,比如从数组到堆栈,比如列表,然后到可观察的集合,现在我得到了绑定列表,每一个都有自己的特性。谢谢。啊!我忘记了绑定列表。我已经有好几年没有这样做了,我记得在走上我建议的事件处理程序之路后,我发现这就是我问题的答案。我总是得到一些新的东西,比如从数组到堆栈,比如列表,然后到可观察的集合,现在我得到了绑定列表,每一个都有自己的特性。非常感谢。