Могу ли я сделать редактор коллекции по умолчанию и / или пользовательский редактор пользовательского интерфейса, вызывающий метод доступа для свойства?
-
06-07-2019 - |
Вопрос
Я пишу плагин для приложения, в котором у меня есть собственный класс, который атрибутирует нативные объекты программы. 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 никогда не вызывается для сериализации коллекции обратно в строку пользователя в собственном объекте.
Могу ли я изменить редактор коллекции по умолчанию, чтобы он вызывал метод доступа к свойству? Если я настраиваю для свойства UITypeEditor , есть ли способ сохранить его обратно в свойство с помощью средства доступа к набору свойств? Или есть какой-то другой способ заставить код, который обращается к свойству коллекции, получить и установить свойство по значению, а не по ссылке?
Решение
Я не верю, что XML Serializer когда-либо вызовет аксессор set
для коллекции. Вместо этого он просто вызовет метод Add экземпляра коллекции, который он извлекает из средства доступа get
.
Я полагаю, что вам нужно, чтобы тип вашей коллекции переопределял методы Add и Remove и тому подобное, чтобы изменить коллекцию, а затем сериализовать измененную коллекцию обратно в свойство пользователя.