2009-05-15 7 views
2

(mise à jour) ICustomTypeDescriptor fonctionne pour mon application Windows Forms, mais pas pour Silverlight; Non supporté. Je vais continuer à enquêter sur cette idée et voir où je vais. (/ mise à jour)C# INotifyPropertyChanged sur les propriétés d'un objet créé dynamiquement?

je, dire quelques panneaux de commutation (pour ceux qui aiment les analogies). Chacun de ces panneaux de commutation comporte des commutateurs dont le nom (chaîne) peut être dans l'état (bool) de On ou Off. Le panneau de commutation et les commutateurs sont des objets dotés de l'interface INotify.

À l'aide des commutateurs noms, je crée une liste de tous les noms de commutation possibles sur la collection et de créer une classe dynamique qui a tous ces noms comme des propriétés.

SwitchPanel1 (Switches(Switch1 ("Main",On) , Switch2("Slave",Off))) 
SwitchPanel2 (Switches(Switch1 ("Bilge",On) , Switch2("Main",Off))) 

Produit une collection de

(Main,Bilge,Slave) 

Et une classe dynamique est produit qui a les propriétés:

SwitchPanel : (SwitchPanel) 
Main : (Switch) 
Bilge : (Switch) 
Slave: (Switch) 

L'idée est que si le panneau de commande comporte un interrupteur avec le nom de la propriété, il est placé sur cette propriété. Donc, en utilisant un peu de LINQ

propeties["Main"].SetValue(newSwitchType,SwitchPanel.Switches.FirstOrDefault(sw => sw.Name == "Main")); 

Je veux lancer cette nouvelle classe dynamique INotfyPropertyChanged ET attraper les changements réels sur ces nouvelles propriétés, donc si un changement de commutation indiquent l'objet dynamique fera rapport.

Pourquoi? Il doit être affiché dans une vue de liste et la vue de liste que j'utilise a sa liaison en fournissant le nom de propriété, et non le chemin de liaison.

Il tente également d'attraper des événements iNotify en jetant l'objet contre INotifyPropertyChanged. Cela signifie qu'il va trier et/ou grouper quand les choses changent.

Si vous connaissez une meilleure façon de faire me le faire savoir. S'il vous plaît.

Répondre

1

Vous n'avez probablement pas besoin d'une classe dynamique. Vous pouvez implémenter les propriétés de liaison d'exécution via ICustomTypeDescriptor/GetProperties(), en créant votre propre implémentation PropertyDescriptor qui renvoie le commutateur nommé. On ne sait pas ce que sait d'abord au sujet du changement, mais vous pouvez soit utiliser INotifyPropertyChanged, ou l'événement change plus spécifiques à la propriété, encore une fois liée à chaque propriété (de sorte que chaque PropertyDescriptor attache, par exemple, l'événement dans le commutateur nommé.

non trivial, mais pas impossible non plus.

+0

Comme vous le dites, non trivial, mais certainement plus facile que la génération d'une classe dynamique ... –

+0

Cela pourrait être une façon intéressante de le faire, et il est certainement mon suscite la curiosité. est-ce que donner un aller et de faire rapport. – Dann

+0

travaillé normalement, mais pas avec un autre projet parce que c'est dans Silverlight (comme cela ne prend pas en charge ICustomTypeDescriptor, grrr). célébrera comme la réponse, mais toutes les idées pour s Ilverlight serait bien aussi. – Dann

Questions connexes