Можно ли инициализировать свойство List<T> элемента управления в разметке?

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

Вопрос

Допустим, у нас есть следующее:

public enum RenderBehaviors
{
    A,
    B,
    C,
}

public class MyControl : Control
{
    public List<RenderBehaviors> Behaviors { get; set; }

    protected override void Render(HtmlTextWriter writer)
    {
        // output different markup based on behaviors that are set
    }
}

Можно ли инициализировать свойство Behaviors в разметке ASPX/ASCX?то есть:

<ns:MyControl runat="server" ID="ctl1" Behaviors="A,B,C" />

В этом случае создание подклассов недопустимо (фактическое назначение поведений немного отличается от этого примера).WebForms генерирует ошибку синтаксического анализатора, когда я пытаюсь инициализировать свойство таким образом.Тот же вопрос можно применить и к другим типам списков (int, строки).

Это было полезно?

Решение

Изучив это дальше, я обнаружил, что WebForms использует TypeConverter, если может его найти.Тип или недвижимость должны быть оформлены должным образом, как подробно описано в этом документе. связанный вопрос.

Я реализовал что-то похожее на это:

public class MyControl : Control
{
    private readonly HashSet<RenderBehaviors> coll = new HashSet<RenderBehaviors>();

    public IEnumerable<RenderBehaviors> Behaviors { get { return coll; } }

    public string BehaviorsList
    {
        get { return string.Join(',', coll.Select(b => b.ToString()).ToArray()); }
        set
        {
            coll.Clear();
            foreach (var b in value.Split(',')
                .Select(s => (RenderBehvaior)Enum.Parse(typeof(RenderBehavior), s)))
            {
                coll.Add(b);
            }
        }
    }
}

Другие советы

Ваше собственное предложение строкового свойства — единственное решение при работе с разметкой.

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