我希望能够使用App.config在我的属性网格上设置属性的可见性。我试过了:
[Browsable(bool.Parse(Sytem.Configuration.ConfigurationSettings.AppSettings["testBool"]))]
然而,Visual Studio 2008会给我一个错误“属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式”。 有没有办法在App.config上设置这个bool?
答案 0 :(得分:2)
你不能在app.config上面做。这是基于设计时的,您的app.config在运行时被读取并使用。
答案 1 :(得分:2)
你不能通过配置这样做;但您可以通过编写自定义组件模型实现来控制属性;即编写自己的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 :(得分:1)
属性网格使用反射来确定要显示的属性以及如何显示它们。您无法在任何类型的配置文件中设置此项。您需要将此属性应用于类本身的属性。