【问题标题】:Inotify change to another class or object通知对另一个类或对象的更改
【发布时间】:2012-05-14 09:06:27
【问题描述】:

我在一个小修复中,我有一个如下的课程。

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 值。

您能帮我解决一下吗?

【问题讨论】:

    标签: vb.net inotifypropertychanged


    【解决方案1】:

    尝试改用BindingList(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
    

    【讨论】:

    • 啊!我忘记了绑定列表。自从我需要这样做已经有几年了,我记得在我建议的事件处理程序道路上发现之后。
    • 谢谢你这是我问题的答案。我总是得到一些新的东西,比如从数组进化到像列表一样的堆栈,然后到 Observable 集合,现在我得到了 Binding List,每个都有自己的特性。谢谢。
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 2011-04-03
      • 2013-03-23
      相关资源
      最近更新 更多