2012-05-04 4 views
2

私は小さな修正をしていますが、私は以下のクラスを持っています。別のクラスまたはオブジェクトへのInotifyの変更

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 

itemsItemDetailsオブジェクトのいずれかに変更があったとき、どのように私はprimeでいくつかのx値を更新することができます。

解決方法を教えてください。

答えて

3

ではなく​​を使用してみてください、あなたは変更イベントをリッスンすることができます

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 
+2

ああ!私はBindingListを忘れていました。私はこれを行う必要があったので、2年経ちました。私は、イベントハンドラの道を下った後にそれを見つけたことを覚えています。 –

+0

これは私の問題の答えです。私は常にArraysからStacksのような新しいものをリストのように取得してからObservableコレクションに渡しています。今はBinding Listを持っています。それぞれに独自の機能があります。ありがとうございました。 – surpavan

1

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 
関連する問題