2009-06-15 3 views
0

Ich habe eine Klasse, die INotifyPropertyChanged für eine Eigenschaft implementiert.Layered INotifyPropertyChanged

Ich habe ein Steuerelement, das an diese Eigenschaft gebunden ist.

Ich habe eine andere Klasse, die das propertychanged-Ereignis abhört. Im Ereignishandler dieser Klasse ändere ich den Wert der Eigenschaft im Code.

Das Problem, das ich habe, ist, dass ich keine Logik in der Event-Handler für das nächste Mal, dass es aufgrund der Änderung der Eigenschaft aufgrund des Codes ausgelöst werden soll.

Wenn jedoch der Benutzer den Wert der Eigenschaft in der Zwischenzeit (über asynchrone GUI-Eingabe) ändert, möchte ich immer noch die Logik auslösen. Ich muss auch sicherstellen, dass das Steuerelement aktualisiert wird (das ist zweifache Bindung).

Was ist der beste Weg, dies zu tun, ohne dass dies zu einem kompletten Chaos wird?

Antwort

2

Eine Möglichkeit, dies zu erreichen, wäre, den Setter Ihrer Eigenschaft so zu refaktorieren, dass er eine Methode aufruft, die einen Parameter verwendet, der angibt, ob das Ereignis ausgelöst werden soll oder nicht. Hier ist ein einfaches Codebeispiel:

Imports System.ComponentModel 

Public Class Class1 
    Implements INotifyPropertyChanged 

    Public Property MyData() As String 
     Get 
      Return _myData 
     End Get 
     Set(ByVal value As String) 
      SetMyData(value, True) 
     End Set 
    End Property 
    Private Sub SetMyData(ByVal value As String, ByVal triggerPropertyChanged As Boolean) 
     _myData = value 
     If triggerPropertyChanged Then 
      OnPropertyChanged("MyData") 
     End If 
    End Sub 
    Private _myData As String 

    Private Sub OnPropertyChanged(ByVal propertyName As String) 
     SetMyData("new value", False) 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) 
    End Sub 
    Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged 
End Class 
1

Ihre Frage ist ein wenig vage, aber Sie können überprüfen, ob der Wert tatsächlich geändert wurde, um festzustellen, ob Sie Ihre Logik tun sollten. Es wäre besser, wenn Sie einen Code hinzufügen, um genauer in Ihrer Frage zu sein.