Posso fazer o editor coleção padrão e / ou um Editor de UI personalizada invocar o acessor definido para uma propriedade?
-
06-07-2019 - |
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?
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.