Propriétés – comment éviter la répétition de code

Lors de la création d’une classe qui sera utilisée dans un modèle de vue pour une application qui suit le modèle MVVM, je dois implémenter les propriétés de cette façon:

private ssortingng _MySsortingngPropertyA; public ssortingng MySsortingngPropertyA { get {return _MySsortingngPropertyA;} set { _MySsortingngPropertyA=value; OnPropertyChanged(()=>MySsortingngPropertyA); } } private ssortingng _MySsortingngPropertyB; public ssortingng MySsortingngPropertyB { get {return _MySsortingngPropertyB;} set { _MySsortingngPropertyB=value; OnPropertyChanged(()=>MySsortingngPropertyB); } } 

au lieu du plus simple

 public ssortingng MySsortingngPropertyA {get;set;} public ssortingng MySsortingngPropertyA {get;set;} 

tout simplement parce que je dois soulever l’événement sur le poseur. En plus de rallonger mon code, je pense qu’il a une odeur de code de programmation copier / coller. Que puis-je faire pour éviter cela? Est-il possible de construire une classe générique telle que, je ne sais pas, MVVMEnabled que je peux implémenter en tant que:

 public MVVMEnabled MySsortingngPropertyA {get;set;} public MVVMEnabled MySsortingngPropertyB {get;set;} 

afin que le code de la classe générique garantisse que OnPropertyChanged se déclenche lorsque la valeur est définie?

Là où je travaille, nous faisons quelque chose de similaire à votre suggestion MVVMEnabled et cela fonctionne bien.

La seule chose à surveiller est que la valeur de la propriété est maintenant cachée dans une propriété de MVVMEnabled (valeur, par exemple), vous obtenez donc une expression de liaison légèrement plus détaillée, telle que {Binding MySsortingngPropertyA.Value}

Pour ce faire, MVVMEnabled implémente INotifyPropertyChanged. Vous aurez besoin d’une propriété, telle que Value qui est la valeur qui sera gérée (une chaîne dans votre exemple):

 public T Value { get{return m_Value;} set { if(m_Value != value) { m_Value = value; OnPropertyChanged(()=>Value); } } } 

Dans votre classe principale, mettez votre propriété en lecture seule:

 public MVVMEnabled MySsortingngPropertyA {get;private set;} 

Et initialisez-le dans le constructeur:

 public SomeModel() { this.MySsortingngPropertyA = new MVVMEnabled(); } 

En lecture seule, c’est parce que vous allez modifier la valeur via la propriété Value , jamais la propriété MVVMEnabled .

Maintenant, quand vous avez besoin de le changer, faites quelque chose comme ça:

 this.MySsortingngPropertyA.Value = "hello, world"; 

Et tant que votre liaison est la suivante:

 {Binding MySsortingngPropertyA.Value} 

Tu devrais aller bien.

Eh bien, je vous suggérerais de créer des extraits de code, de cette manière, il ne vous faudra pas beaucoup d’efforts pour écrire plusieurs propriétés.

Je ne pense pas que quelque chose comme cela fonctionnerait – du moins je n’ai jamais vu une telle chose auparavant.

À la place, vous pouvez utiliser la programmation par aspect avec PostSharp pour le faire:

 [NotifyPropertyChanged] public class MyClass { public ssortingng MySsortingngPropertyA {get;set;} public ssortingng MySsortingngPropertyA {get;set;} // ...