.NET Property Grid - настройка Browsable (bool) с помощью App.config

Я хотел бы иметь возможность установить видимость свойства в моей сетке свойств с помощью App.config. Я пытался:

[Browsable(bool.Parse(Sytem.Configuration.ConfigurationSettings.AppSettings["testBool"]))]

Однако Visual Studio 2008 выдаст мне ошибку "Аргумент атрибута должен быть выражением константы, выражением typeof или выражением создания массива типа параметра атрибута". Есть ли способ установить этот bool на App.config?

3 ответа

Вы не можете сделать выше в app.config. Это время разработки, и ваш app.config читается и используется во время выполнения.

Вы не можете сделать это с помощью конфигурации; но вы можете управлять атрибутами, написав собственную реализацию модели компонента; т.е. писать свой собственный PropertyDescriptorи используя ICustomTypeDescriptor или же TypeDescriptionProvider связать это. Много работы.


Обновить

Я думал о хитром способе сделать это; см. ниже, где мы фильтруем его по 2 из свойств, используя строку во время выполнения. Если вы не являетесь владельцем типа (чтобы установить [TypeConverter]), то вы можете использовать:

TypeDescriptor.AddAttributes(typeof(Test),
    new TypeConverterAttribute(typeof(TestConverter)));

связать конвертер во время выполнения.

using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;
using System;
class TestConverter : ExpandableObjectConverter
{
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, System.Attribute[] attributes)
    {
        PropertyDescriptorCollection orig = base.GetProperties(context, value, attributes);
        List<PropertyDescriptor> list = new List<PropertyDescriptor>(orig.Count);
        string propsToInclude = "Foo|Blop"; // from config
        foreach (string propName in propsToInclude.Split('|'))
        {
            PropertyDescriptor prop = orig.Find(propName, true);
            if (prop != null) list.Add(prop);
        }
        return new PropertyDescriptorCollection(list.ToArray());
    }
}
[TypeConverter(typeof(TestConverter))]
class Test
{
    public string Foo { get; set; }
    public string Bar { get; set; }
    public string Blop { get; set; }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Test test = new Test { Foo = "foo", Bar = "bar", Blop = "blop"};
        using (Form form = new Form())
        using (PropertyGrid grid = new PropertyGrid())
        {
            grid.Dock = DockStyle.Fill;
            form.Controls.Add(grid);
            grid.SelectedObject = test;
            Application.Run(form);
        }
    }
}

Сетка свойств использует отражение, чтобы выяснить, какие свойства отображать и как их отображать. Вы не можете установить это в любом виде файла конфигурации. Вам необходимо применить этот атрибут к свойству в самом классе.

Другие вопросы по тегам