C # Свойство коллекции компонентов не сериализуется при заполнении из установщика свойств - PullRequest
0 голосов
/ 21 апреля 2011

У меня есть компонент C #, который имеет два свойства: Property1 и Property2.Property1 - это простое свойство типа int, а Property2 - это список, где T - это пользовательский класс.Property2 имеет установленный атрибут DesignerSerializationVisibility.Content.

Когда свойство Property1 установлено в Designtime, компонент должен сгенерировать количество установленных пользовательских классов.Это работает, но классы не сериализуются в файл 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; }
    }
}

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Свойство 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 голос
/ 02 мая 2012

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


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

this.Container.Add (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
}
...