Posso fazer o editor coleção padrão e / ou um Editor de UI personalizada invocar o acessor definido para uma propriedade?

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

Pergunta

Eu estou escrevendo um plug-in para um aplicativo onde eu tenho uma classe personalizada que atribui os objetos nativos do programa. A API permite-me a ler e escrever strings com chave diretamente de e para os objetos no arquivo nativo. Então, em vez de ler e escrever para campos privados na obter e definir acessores de cada propriedade que estou lendo e escrevendo essas cadeias de usuários de e para os objetos nativos no programa.

O utilizador acede a estas propriedades, através de um controle PropertyGrid. Até agora, este é tudo muito bem trabalho com propriedades simples só que agora eu preciso para armazenar uma coleção personalizada ( FloorCollection ) de um tipo de objeto personalizado ( Piso ).

Então eu tenha configurado uma propriedade usando XmlSerializer . O acessor GET lê a string user dos objetos nativos, e, em seguida, a string é desserializado em uma instância de FloorCollection. O acessor SET faz o inverso, lendo em uma instância de uma FloorCollection , e serialização-lo para a cadeia usuário.

Aqui está o que a minha propriedade se parece com:

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

Eu posso abrir esta propriedade coleção através da minha PropertGrid no editor de coleção padrão. No entanto, o editor de coleção padrão apenas edita a coleção na referência fornecido pelo assessor GET, em vez de chamar o acessor definido para salvá-lo de volta para o objeto. Para que eu possa editar a coleção no editor padrão, mas quando eu fechar e reabrir o editor a coleção não terá mudado porque o acessor SET nunca é chamado para serializar a parte de trás coleção para a cadeia usuário no objeto nativo.

Posso modificar o editor de coleção padrão para chamar o acessor set da propriedade? Se eu configurar um costume UITypeEditor para a propriedade há uma maneira de tê-lo, salvo de volta para a propriedade usando o acessor propriedade set? Ou há alguma outra maneira de código de força que está a aceder a propriedade de coleção para obter e definir a propriedade por valor em vez de referência?

Foi útil?

Solução

Eu não acredito que o Serializer XML nunca vai chamar o acessor set para uma coleção. Em vez disso, ele só irá chamar o método Add da instância de coleção que recupera do acessor get.

Eu acredito que você vai precisar de ter o seu tipo de coleção substituir o Adicionar e Remover métodos e tal para modificar a coleção, e depois serializar a parte de trás coleção modificado na propriedade do usuário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top