Puis-je faire en sorte que l'éditeur de collection par défaut et / ou un éditeur d'interface utilisateur personnalisé appelle l'accesseur set pour une propriété?

StackOverflow https://stackoverflow.com/questions/1209452

Question

J'écris un plug-in pour une application dans laquelle j'ai une classe personnalisée qui attribue les objets natifs du programme. L'API me permet de lire et d'écrire des chaînes à clé directement vers et depuis les objets du fichier natif. Donc plutôt que de lire et d’écrire dans des champs privés dans les accesseurs Get et Set de chaque propriété, je lis et écris ces chaînes d’utilisateur dans et à partir des objets natifs du programme.

L'utilisateur accède à ces propriétés par le biais d'un contrôle PropertyGrid. Jusqu'à présent, tout fonctionne correctement avec des propriétés simples, sauf que je dois désormais stocker une collection personnalisée ( FloorCollection ) d'un type d'objet personnalisé ( Floor ).

J'ai donc configuré une propriété à l'aide de XmlSerializer . L'accesseur GET lit la chaîne utilisateur à partir des objets natifs, puis la chaîne est désérialisée dans une instance de FloorCollection. L’accesseur SET effectue l’inverse en lisant une instance de FloorCollection et en le sérialisant avec la chaîne utilisateur.

Voici à quoi ressemble ma propriété:

public FloorCollection Floors
{
    get 
    {
        string oldString = this.GetBaseObjUserString("CPFloors");
        if (oldString == null) return null;

        XmlSerializer serializer = new XmlSerializer(typeof(FloorCollection));
        StringReader strReader = new StringReader(oldString);

        FloorCollection newCollection =                 
        (FloorCollection)serializer.Deserialize(strReader);
        return newCollection;
    }

    set 
    {
        FloorCollection newCol = value;

        if (newCol == null) return;

        //serializes new collection
        XmlSerializer serializer = new XmlSerializer(typeof(FloorCollection));
        StringWriter sw = new StringWriter();

        serializer.Serialize(sw, newCol);

        string newString = sw.ToString();

        this.SetBaseObjUserString("CPFloors", newString);
    }
}

Je peux ouvrir cette propriété de collection via PropertGrid dans l'éditeur de collection par défaut. Cependant, l'éditeur de collection par défaut n'édite la collection qu'à la référence fournie par l'accesseur GET, plutôt que d'appeler l'accesseur SET pour le sauvegarder dans l'objet. Je peux donc modifier la collection dans l'éditeur par défaut, mais lorsque je ferme et rouvre l'éditeur, la collection ne change pas, car l'accesseur SET n'est jamais appelé pour sérialiser la collection sur la chaîne utilisateur dans l'objet natif.

Puis-je modifier l'éditeur de collection par défaut pour appeler l'accesseur d'ensemble de la propriété? Si je configure un UITypeEditor personnalisé pour la propriété, existe-t-il un moyen de le sauvegarder dans la propriété à l'aide de l'accesseur du jeu de propriétés? Ou existe-t-il un autre moyen de forcer le code qui accède à la propriété de collection à obtenir GET et à SET la propriété par valeur plutôt que par référence?

Était-ce utile?

La solution

Je ne crois pas que le sérialiseur XML appellera jamais l'accesseur set pour une collection. Au lieu de cela, il appellera simplement la méthode Add de l'instance de collection extraite à partir de l'accesseur get .

Je pense que vous devez faire en sorte que votre type de collection remplace les méthodes d'ajout et de suppression, par exemple, pour modifier la collection, puis sérialiser la collection modifiée dans la propriété de l'utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top