Могу ли я сделать редактор коллекции по умолчанию и / или пользовательский редактор пользовательского интерфейса, вызывающий метод доступа для свойства?

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

Вопрос

Я пишу плагин для приложения, в котором у меня есть собственный класс, который атрибутирует нативные объекты программы. 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 и тому подобное, чтобы изменить коллекцию, а затем сериализовать измененную коллекцию обратно в свойство пользователя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top