2009-10-23 8 views
3

J'écris .NET3.5, application WPF utilisant Composite Application Library. L'application est divisée en plusieurs modules.Comment sérialiser les propriétés jointes

Dans le module d'infrastructure, j'ai défini l'objet NetworkNode. Le module Réseau gère une collection de NetworkNodes et utilise XmlSerializer pour stocker/charger cette collection. Jusqu'à présent tout fonctionne.

Mais j'ai d'autres modules, par exemple NodeModule. Si un NetworkNode a été sélectionné dans le module Réseau, un événement est publié dans d'autres modules à l'aide de EventAggregator. Ces modules peuvent attacher diverses informations au NetworkNode en utilisant les propriétés jointes.

Le problème est que NetworkModule ne connaît pas les autres modules, par conséquent, ces propriétés ne sont pas sérialisées. Est-il possible de lister et de sérialiser en quelque sorte toutes les propriétés attachées à un objet? Ou dois-je changer le concept et utiliser autre chose que les propriétés attachées?

Cordialement

Répondre

3

Vous pouvez lister toutes les propriétés de dépendance (attachés ou non) définies sur un objet en utilisant DependencyObject.GetLocalValueEnumerator:

LocalValueEnumerator propEnumerator = foo.GetLocalValueEnumerator(); 
    while (propEnumerator.MoveNext()) 
    { 
     Console.WriteLine ("{0} = {1}", 
          propEnumerator.Current.Property.Name, 
          propEnumerator.Current.Value); 
    } 

Cependant, cela ne va pas aider pour la sérialisation XML (à moins que vous implémentez IXmlSerializable, qui est une douleur. ..). Vous devriez probablement utiliser XamlWriter au lieu (que je suppose est ce que Drew parlait, puisqu'il n'y a pas XamlSerializer ...)

3

Étant donné que les propriétés attachées ne sont pas visibles d'un point de vue purement CLR, le XmlSerializer n'a aucun moyen de savoir à leur sujet. Vous devrez passer à l'utilisation de l'architecture XamlSerializer pour pouvoir sérialiser à la fois les objets CLR "simples" et avoir la connaissance particulière de DependencyObjects.

1

Si vous utilisez .Net 4.0 (je crois qu'ils ne sont pas en .Net 3.5)

Vous pouvez utiliser IAttachedPropertyStore ou AttachablePropertyServices

Référence Exemple # 1: http://blogs.msdn.com/b/bursteg/archive/2009/05/18/xaml-in-net-4-0-attached-properties-iattachedpropertystore-and-attachablepropertyservices.aspx

De plus, en général, la propriété doit être fixé correctement défini:

  1. Il doit s'agir d'une propriété de type non-imbriqué public (ou interne dans certains scénarios) (c.-à-d. il n'est pas déclarée dans un autre type), T.
  2. Définir une nouvelle AttachableMemberIdentifier (T, "MyProperty")
  3. Fournir des méthodes statiques publiques sur T appelées "SetMyProperty" et "GetMyProperty", à savoir la partie "MyProperty" doit correspond à votre AttachableMemberIdentifier. (Vous ne pouvez pas utiliser "Foo" comme nom dans AttachableMemberIdentifier et les appeler "SetBar" et "GetBar" car la pile de sérialiseurs Xaml doit les trouver par réflexion.) Ces méthodes doivent ensuite utiliser AttachablePropertyServices pour stocker la valeur de la propriété attachée .

Référence Exemple # 2: http://blogs.msdn.com/b/mwinkle/archive/2009/12/07/attachedproperty-part-2-putting-it-together.aspx

Questions connexes