Могу ли я сделать редактор коллекции по умолчанию и / или пользовательский UIEditor, вызывающий метод доступа set для свойства? - PullRequest
1 голос
/ 31 июля 2009

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

1 Ответ

0 голосов
/ 31 июля 2009

Я не верю, что XML Serializer когда-либо вызовет аксессор set для коллекции. Вместо этого он просто вызовет метод Add экземпляра коллекции, который он извлекает из средства доступа get.

Полагаю, вам нужно, чтобы тип вашей коллекции переопределил методы Add и Remove и тому подобное, чтобы изменить коллекцию, а затем сериализовать измененную коллекцию обратно в свойство пользователя.

...