.NET Property Grid - настройка за разглеждане (bool) с помощта на App.config

Бих искал да мога да задам видимостта на свойство в моята мрежа със свойства с помощта на App.config. Опитах :

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

Въпреки това Visual Studio 2008 ще ми даде грешка „Аргументът на атрибут трябва да бъде постоянен израз, израз тип на израз или израз за създаване на масив от тип параметър на атрибут“. Има ли някакъв начин да зададете този 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