.NET Property Grid - настройка Browsable (bool) с помощью App.config - PullRequest
1 голос
/ 11 августа 2009

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

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

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

Ответы [ 3 ]

2 голосов
/ 11 августа 2009

Вы не можете сделать это через 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);
        }
    }
}
2 голосов
/ 11 августа 2009

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

1 голос
/ 11 августа 2009

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

...