Posso fare in modo che l'editor di raccolta predefinito e / o un editor di interfaccia utente personalizzato invocino l'accessor set per una proprietà?

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

Domanda

Sto scrivendo un plug-in per un'applicazione in cui ho una classe personalizzata che attribuisce gli oggetti nativi del programma. L'API mi consente di leggere e scrivere stringhe con chiave direttamente da e verso gli oggetti nel file nativo. Quindi, piuttosto che leggere e scrivere in campi privati ??negli accessi Get e Set di ogni proprietà che sto leggendo e scrivendo queste stringhe utente da e verso gli oggetti nativi nel programma.

L'utente accede a queste proprietà tramite un controllo PropertyGrid. Finora tutto funziona bene con proprietà semplici, tranne ora che devo archiviare una raccolta personalizzata ( FloorCollection ) di un tipo di oggetto personalizzato ( Floor ).

Quindi ho impostato una proprietà usando XmlSerializer . L'accessorio GET legge la stringa utente dagli oggetti nativi, quindi la stringa viene deserializzata in un'istanza di FloorCollection. L'accessorio SET fa il contrario leggendo in un'istanza di FloorCollection e serializzandolo sulla stringa utente.

Ecco come appare la mia proprietà:

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);
    }
}

Posso aprire questa proprietà della raccolta tramite PropertGrid nell'editor di raccolta predefinito. Tuttavia, l'editor di raccolta predefinito modifica la raccolta solo nel riferimento fornito dall'accessorio GET, invece di richiamare l'accessorio SET per salvarlo nuovamente nell'oggetto. Quindi posso modificare la raccolta nell'editor predefinito, ma quando chiudo e riapro l'editor la raccolta non sarà cambiata perché l'accessorio SET non viene mai chiamato per serializzare la raccolta sulla stringa utente nell'oggetto nativo.

Posso modificare l'editor di raccolta predefinito per chiamare l'accessor set della proprietà? Se imposto un UITypeEditor personalizzato per la proprietà, c'è un modo per salvarlo sulla proprietà usando l'accessorio di impostazione della proprietà? Oppure esiste un altro modo per forzare il codice che sta accedendo alla proprietà collection su GET e SET la proprietà in base al valore anziché al riferimento?

È stato utile?

Soluzione

Non credo che il serializzatore XML chiamerà mai l'accessor set per una raccolta. Invece, chiamerà semplicemente il metodo Add dell'istanza di raccolta che recupera dall'accessorio get .

Credo che dovrai avere il tuo tipo di raccolta sovrascrivere i metodi Aggiungi e Rimuovi e simili per modificare la raccolta, quindi serializzare nuovamente la raccolta modificata nella proprietà dell'utente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top