cap:
Νατάσα Μανουσοπούλου:Αν το PropertyChanged event προκαλείται κάθε φορά που αλλάζει η τιμή οποιυδήποτε property που συμμετέχει σε binding, τότε η συμπεριφορά αυτή δεν έχει να προσφέρει κάτι. Αντίθετα, ενημερώνει τα controls πολλαπλές φορές σε συνεχόμενες αλλαγές διαφορετικών properties.
Αυτό ακριβώς ήταν που μου έκανε εντύπωση. Φαντάσου να έχω ένα business object με 1000 properties (λέμε τώρα) bound σε αντίστοιχα 1000 controls μιας μεγαααααλης φόρμας (και πάλι λέμε τώρα) και να αλλάξει ΕΝΑ property. Θα γίνουν update και τα 1000!
Είναι αναπόφευκτο ωστόσο, όταν δεν ξέρεις ποιό από τα 1000 properties θα αλλάξει. Αν ξέρεις, βάζεις το PropeprtyChanged μόνο στο property που σε ενδιαφέρει. Από την άλλη, μπορείς να αποφύγεις έναν τέτοιο σενάριο υλοποιώντας τον κατάλληλο μηχανισμό. Πρόσεξε: Ο designer όταν σχεδιάζει τη φόρμα βάζει στην αρχή Me.SuspendLayout και αφού τοποθετήσει όλα τα controls, στο τέλος Me.ResumeLayout(False) ώστε να αποφύγει τον τμηματικό σχεδιασμό της φόρμας. Το ίδιο κάνει και το DataRow object όπου με DataRow.BeginEdit κάνεις suspend την ενεργοποίηση των events που προκύπτουν από τα validation rules και στο τέλος με DataRow.ΕndEdit κάνεις ένα συνολικό validate. Αντίστοιχα κι εσύ μπορείς να φτιάξεις ένα ζευγάρι Begin/End ή Suspend/Resume για τη business κλάση σου. Πχ:
Imports System.ComponentModel
Public Class Customer
Implements INotifyPropertyChanged
Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Private _CustomerID As String
Private _CustomerName As String
Private notificationSuspended As Boolean = False
Public Property CustomerID() As String
Get
Return _CustomerID
End Get
Set(ByVal value As String)
_CustomerID = value
RaisePropertyChanged("CustomerID")
End Set
End Property
Public Property CustomerName() As String
Get
Return _CustomerName
End Get
Set(ByVal value As String)
_CustomerName = value
RaisePropertyChanged("CustomerName")
End Set
End Property
Public Sub SuspendNotification()
notificationSuspended = True
End Sub
Public Sub ResumeNotification(ByVal notifyChanges As Boolean)
notificationSuspended = False
If notifyChanges Then
RaisePropertyChanged(String.Empty)
End If
End Sub
Private Sub RaisePropertyChanged(ByVal propertyName As String)
If Not notificationSuspended Then
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End If
End Sub
End Class
Έτσι, αν πεις
x.CustomerID = "a"
x.CustomerName = "b"
τρέχουν δύο events. Αν πεις
x.SuspendNotification()
x.CustomerID &= "2"
x.CustomerName &= "2"
x.ResumeNotification(True)
τρέχει ένα event. Και αν πεις
x.SuspendNotification()
x.CustomerID &= "3"
x.CustomerName &= "3"
x.ResumeNotification(False)
δεν τρέχει κανένα event.
Happy?
Vir prudens non contra ventum mingit