¿Puedo hacer que el editor de colecciones predeterminado y / o un editor de interfaz de usuario personalizado invoque el conjunto de elementos de acceso para una propiedad?

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

Pregunta

Estoy escribiendo un complemento para una aplicación donde tengo una clase personalizada que atribuye los objetos nativos del programa. La API me permite leer y escribir cadenas con clave directamente desde y hacia los objetos en el archivo nativo. Así que en lugar de leer y escribir en campos privados en los accesos Obtener y Establecer de cada propiedad, estoy leyendo y escribiendo estas cadenas de usuario hacia y desde los objetos nativos del programa.

El usuario accede a estas propiedades a través de un control PropertyGrid. Hasta ahora, todo funciona bien con propiedades simples, excepto que ahora necesito almacenar una colección personalizada ( FloorCollection ) de un tipo de objeto personalizado ( Floor ).

Así que he configurado una propiedad usando XmlSerializer . El descriptor de acceso GET lee la cadena de usuario de los objetos nativos y luego la cadena se deserializa en una instancia de FloorCollection. El acceso al SET hace lo contrario al leer en una instancia de FloorCollection , y serializarlo a la cadena de usuario.

Así es como se ve mi propiedad:

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

Puedo abrir esta propiedad de colección a través de PropertGrid en el editor de colección predeterminado. Sin embargo, el editor de colección predeterminado solo edita la colección en la referencia proporcionada por el descriptor de acceso GET, en lugar de llamar al descriptor de acceso SET para guardarlo nuevamente en el objeto. Por lo tanto, puedo editar la colección en el editor predeterminado, pero cuando cierro y vuelvo a abrir el editor, la colección no habrá cambiado porque nunca se llama al descriptor de acceso SET para serializar la colección a la cadena de usuario en el objeto nativo.

¿Puedo modificar el editor de colecciones predeterminado para llamar al descriptor de acceso establecido de la propiedad? Si configuro un UITypeEditor personalizado para la propiedad, ¿hay alguna manera de hacer que se guarde en la propiedad utilizando el acceso al conjunto de propiedades? ¿O hay alguna otra forma de forzar el código que está accediendo a la propiedad de la colección para OBTENER y CONFIGURAR la propiedad por valor en lugar de hacer referencia?

¿Fue útil?

Solución

No creo que el XML Serializer llame nunca al acceso set para una colección. En su lugar, solo llamará al método Add de la instancia de colección que recupera del acceso get .

Creo que necesitará que su tipo de colección anule los métodos de Agregar y Eliminar y, por lo tanto, modificar la colección y luego serializar la colección modificada en la propiedad del usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top