Я пишу плагин для приложения, в котором у меня есть собственный класс, который атрибутирует нативные объекты программы. API позволяет мне читать и записывать строки с ключами непосредственно в и из объектов в собственном файле. Поэтому вместо чтения и записи в частные поля в средствах доступа Get и Set каждого свойства я читаю и записываю эти пользовательские строки в и из собственных объектов в программе.
Пользователь обращается к этим свойствам через элемент управления PropertyGrid. Пока что все это работает нормально с простыми свойствами, за исключением того, что теперь мне нужно хранить пользовательскую коллекцию ( FloorCollection ) пользовательского типа объекта ( Floor ).
Итак, я установил свойство с помощью XmlSerializer . Метод доступа GET считывает пользовательскую строку из собственных объектов, а затем строка десериализуется в экземпляр FloorCollection. Метод доступа SET выполняет обратное действие, считывая экземпляр FloorCollection и сериализуя его в строку пользователя.
Вот как выглядит моя собственность:
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);
}
}
Я могу открыть это свойство коллекции через мой PropertGrid в редакторе коллекции по умолчанию. Однако редактор коллекции по умолчанию редактирует коллекцию только по ссылке, предоставленной средством доступа GET, а не вызывает метод доступа SET, чтобы сохранить ее обратно в объект. Поэтому я могу редактировать коллекцию в редакторе по умолчанию, но когда я закрою и снова открою редактор, коллекция не изменится, потому что метод доступа SET никогда не вызывается для сериализации коллекции обратно в строку пользователя в собственном объекте.
Можно ли изменить редактор коллекции по умолчанию, чтобы он вызывал метод доступа set к свойству? Если я настраиваю для свойства пользовательский UITypeEditor , есть ли способ сохранить его обратно в свойство с помощью метода доступа набора свойств? Или есть какой-то другой способ заставить код, который обращается к свойству коллекции, получить и установить свойство по значению, а не по ссылке?