2008-10-04 9 views
11

INotifyPropertyChanged est assez explicite et je pense que je suis clair sur quand le soulever (c'est-à-dire quand j'ai fini de mettre à jour les valeurs).
Si j'implémente INotifyPropertyChanging, j'ai tendance à déclencher l'événement dès que j'entre le setter ou une autre méthode qui modifie l'état des objets, puis continue avec les gardes et les validations qui peuvent se produire. Donc, je traite l'événement comme une notification que la propriété peut changer mais n'a pas encore été modifiée, et pourrait ne pas finir de changer correctement.INotifyPropertyChanging et validations: quand est-ce que je lève PropertyChanging?

Si les utilisateurs de l'objet utilisent cette propriété (comme LINQ to SQL en utilisant l'événement pour le suivi des modifications), dois-je attendre et lever l'événement seulement après avoir validé les valeurs que j'ai reçues? sont bons et l'état de l'objet est valable pour le changement?

Quel est le contrat pour cet événement et quels effets secondaires y aurait-il chez les abonnés?

Répondre

13

Si votre objet reçoit une valeur non valide pour la propriété et que vous lancez une exception, vous ne devez pas déclencher l'événement PropertyChanging. Vous ne devez augmenter l'événement que lorsque vous avez décidé que la valeur changera. Le scénario d'utilisation typique est pour changer un champ simple:

public T Foo 
{ get 
    { return m_Foo; 
    } 
    set 
    { if (m_Foo == value) return; //no need for change (or notification) 
     OnPropertyChanging("Foo"); 
     m_Foo = value; 
     OnPropertyChanged("Foo"); 
    } 
} 
+0

vu que vous avez travaillé sur DLINQ (il aurait été appelé alors pas vrai?) Je suppose que c'est assez autoritaire. Y a-t-il une référence à laquelle vous pouvez m'indiquer? –

+0

DLINQ a été développé par la division des développeurs (qui comprend l'équipe Visual Studio). L'équipe ADO.NET a créé LINQ to DataSet et LINQ to Entities. Il y a une référence à http://msdn.microsoft.com/en-us/library/bb425822.aspx#linqtosql_topic25 –

+0

Je suis corrigé. Merci. –

1

En aparté - PostSharp a la capacité intéressante à l'auto-mise en œuvre INotifyPropertyChanged - like so.

+0

c'est intéressant. J'ai utilisé un extrait de code (et il y a une classe de base qui contient l'événement et le soulève) mais il semble que ce soit un problème de quelqu'un d'autre. –

+0

Un autre côté, cela peut également être «auto-implémenté» avec un peu de magie DI/IOC plutôt intéressant - [vu ici] (http://stackoverflow.com/questions/871405/why-do-i-need-an- ioc-conteneur-comme-opposé-à-simple-di-code/1532254 # 1532254) (Je ne suis pas vendu sur ceci, mais il fait une lecture pédagogique intéressante si rien d'autre) – fostandy

0

Si vous souhaitez éviter d'implémenter complètement INotifyPropertyChanged, utilisez plutôt Update Controls .NET. Cela élimine presque tout le code de comptabilité.

Questions connexes