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

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

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

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


person Ghints    schedule 10.08.2009    source источник
comment
(обратите внимание, что я обновил свой ответ примером, который может сделать большую часть того, что вы хотите)   -  person Marc Gravell    schedule 11.08.2009
comment
см. также: stackoverflow.com/questions/1093466/   -  person Rowland Shaw    schedule 28.03.2010


Ответы (3)


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

person Kevin LaBranche    schedule 10.08.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);
        }
    }
}
person Marc Gravell    schedule 10.08.2009
comment
Это очень образованный ответ по теме. Используя ICustomTypeDescriptor или другие типы, связанные с ним (проверьте MSDN, чтобы узнать, что лучше всего подходит для вашего дизайна), вы можете инициализировать свои дескрипторы значениями конфигурации, но вам придется выполнять эту работу вручную (например, конфигурация; см. System.Configuration.ConfigurationSection и и тому подобное), поскольку дескрипторы типа по умолчанию используют атрибуты, применяемые к информации о типе сборки во время компиляции. - person TheXenocide; 04.09.2009

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

person Scott Dorman    schedule 10.08.2009