Свойство коллекции компонентов C # не сериализуется при заполнении из установщика свойств

#c# #collections #components #properties

#c# #Коллекции #Компоненты #свойства

Вопрос:

У меня есть компонент C #, который имеет два свойства, Property1 и Property2. Property1 — это простое свойство типа int, а Property2 — это список, где T — пользовательский класс. Свойство 2 имеет видимость Designerserialization.Набор атрибутов содержимого.

Когда свойство 1 установлено во время разработки, компонент должен генерировать заданное количество пользовательских классов. Это работает, но классы не сериализуются в файл Designer.cs. Когда я добавляю пользовательский класс через стандартный редактор коллекции Visual Studio, класс сериализуется в файл Designer.cs.

Как я могу заставить Visual Studio также сериализовать сгенерированные классы в файле Designer.cs?

Вот небольшой пример того, что у меня есть сейчас:

 public class TestComponent : Component
{
    private int _Count;
    public int Count
    {
        get { return _Count; }
        set 
        { 
            _Count = value;

            Columns.Clear();

            for (int i = 0; i < _Count; i  )
            {
                TestClass tClass = new TestClass();
                tClass.Description = "TestClass"   i.ToString();
                Columns.Add(tClass);
            }
        }
    }

    private List<TestClass> columns = new List<TestClass>();
    [EditorBrowsable(EditorBrowsableState.Never)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public List<TestClass> Columns 
    { 
            get { return columns; } 
    }
}

[ToolboxItem(false), DesignTimeVisible(false)]
public class TestClass : Component
{
    private string _Description;
    public string Description
    {
        get { return _Description; }
        set { _Description = value; }
    }
}
  

Ответ №1:

Свойство Columns не имеет параметра установки. Сериализатор проигнорирует это свойство. Измените на это:

 private List<TestClass> columns = new List<TestClass>();
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<TestClass> Columns 
{ 
        get { return columns; } 
        set { columns = value; }
}
  

Комментарии:

1. Привет, Ричард, это не решило проблему, но я уже нашел решение. Я обновил свой первоначальный вопрос, чтобы отразить решение.

Ответ №2:

ПРИМЕЧАНИЕ: ответ был предоставлен @urk_forever в тексте его вопроса. Я вернул вопрос в исходное состояние и скопировал изменения здесь как CW


ОБНОВЛЕНИЕ: я уже нашел решение. Мне пришлось добавить эту строку:

это.Контейнер.Добавить(TClass); чтобы заставить дизайнера сериализовать созданные классы. Я обновил приведенный ниже код, чтобы отразить это изменение. Теперь классы сериализуются в Designer.cs.

Код изменен следующим образом в for-loop [IAbstract]

 for (int i = 0; i < _Count; i  )
{
    TestClass tClass = new TestClass();
    tClass.Description = "TestClass"   i.ToString();
    Columns.Add(tClass);
    this.Container.Add(tClass);   // <-- added
}