En général, dans le poseur de propriété d'un objet on peut vouloir soulever un événement PropertyChanged tel queWPF événements PropertyChanged excessives
public event PropertyChangedEventHandler PropertyChanged;
protected void Notify(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
public string UserNote
{
get { return _userNote; }
set
{
_userNote = value;
Notify("UserNote");
}
}
Dans notre base de code existant, je vois des cas où PropertyChangedEventArgs est envoyé nulle pour indique que toutes les propriétés de l'objet ont changé. Cela semble inefficace et semble conduire à beaucoup plus d'événements déclenchés que nécessaire. Il semble également causer des problèmes où les objets se mettent à jour les uns les autres de façon circulaire.
Est-ce toujours une bonne pratique?
Un commentaire dans le code tente de justifier ...
//The purpose of this method is to wire up clients of NotificationBase that are also
//NotificationBases to *their* clients. Consider the following classes:
public class ClassA : NotificationBase
{
public int Foo
{
get { return 123; }
set { Notify("Foo"); }
}
}
public class ClassB : NotificationBase
{
ClassA A = new ClassA();
public ClassB()
{
A.PropertyChanged += AllChanged;
}
public void SetFoo()
{
A.Foo = 456;
}
}
public class ClassC
{
ClassB B = new ClassB();
public ClassC()
{
B.PropertyChanged += delegate { dosomething(); };
B.SetFoo(); // causes "dosomething" above to be called
}
}
/// ClassB.SetFoo calls ClassA.Foo's setter, which calls ClassA.Notify("Foo").
/// The event registration in ClassB's ctor causes ClassB.AllChanged to be called, which calls
/// ClassB.Notify(null) - implying that ALL of ClassB's properties have changed.
/// The event registration in ClassC's ctor causes the "dosomething" delegate to be called.
/// So a Notify in ClassA is routed to ClassC via ClassB's PropertyChanged event.
protected void AllChanged(Object sender, PropertyChangedEventArgs e)
{
Notify(null);
}
Toute pensée très appréciée.
Cordialement, Fzzy
Voulez-vous des informations sur les propriétés standard ou DependencyProperty? –
Sans aller trop loin, ce code a l'air un peu effrayant et le gros commentaire essayant de décrire l'intention de la méthode me semble être une grosse "odeur". Qu'est-ce que vous essayez réellement de faire? Le consommateur de l'événement Notification doit décider de ce qu'il doit faire lorsqu'il est informé d'un changement de propriété. –
Un exemple est où nous avons un objet Fixture qui a une propriété FixtureStatus. Il existe un certain nombre d'autres propriétés qui dépendent de FixtureStatus pour déterminer leurs valeurs. Je pense que la méthode Notify devrait être appelée avec le nom de chacune de ces propriétés dépendantes plutôt qu'une notification à tous. Le code commence à être un peu compliqué avec un appel Notify pour chaque propriété dépendante. – user418689