2009-05-20 10 views
2

C'est la même Question que l'une I asked earlier MAIS celle-ci était en référence à C# normal. Ce est Silverlight 2, et je n'ai ICustomTypeDescriptorSilverlight 2: INotifyPropertyChanged sur un objet créé dynamiquement?

Voici donc à nouveau la question:

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. Utilisation des commutateurs Noms, je crée une liste de tous les noms de commutateurs possibles sur la collection et crée une classe dynamique qui a tous ces noms en tant que 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'intercepter les événements INotify en castant l'objet contre INotifyPropertyChanged. Cela signifie qu'il va trier et/ou grouper quand les choses changent.

Répondre

0

Vous pouvez créer un dictionnaire générique dérivé de chaîne, bool qui implémente INotifyPropertyChanged. L'indexeur peut ressembler à ceci:

public new bool this[string key] 
{ 
    get 
    { 
     if(this.ContainsKey(key)) 
      return base[key]; 
     return default(bool); 
    } 
    set 
    { 
     base[key] = value; 
     OnPropertyChanged(key.ToString()); 
    } 
} 

Le dans votre panneau de commande utiliser un IValueConverter personnalisé pour lier les commutateurs au dictionnaire:

http://silverlight.net/forums/t/51864.aspx

De cette façon, vous pouvez toujours avoir une collection dynamique de Noms, chacun avec une valeur booléenne associée, et lier directement aux données sans créer de type dynamique.

+0

Intéressant. Je vais bientôt partir. – Dann

Questions connexes