2

私は小さな修正をしています。以下のようなクラスがあります。

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

のオブジェクトprimeのいずれかに変更があった場合、の x 値を更新するにはどうすればよいですか。ItemDetailsitems

どうすれば解決できるか教えてください。

4

2 に答える 2

3

代わりにa を使用してみてください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
于 2012-05-04T20:39:59.627 に答える
1

ItemDetails クラスは、そのプロパティのいずれかが変更されるたびにイベントを発生させる必要があります。INotifyPropertyChanged インターフェイスを ItemDetails クラスに実装することをお勧めしますが、代わりに独自のイベントを実装することもできます。次に、リストに追加されるときに各 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
于 2012-05-04T20:36:36.060 に答える