BrowsableAttribute
используется многими компонентами модели как механизм, позволяющий избежать его включения. Возможно, лучший вариант - не добавлять [Browsable(false)]
.
Существует несколько других способов фильтрации PropertyGrid
, в том числе (с возрастающей сложностью) TypeConverter
, ICustomTypeDescriptor
, TypeDescriptionProvider
, но, возможно, самый простой способ - указать PropertyGrid
атрибуты, которые описывают вещи, которые вы do want (.BrowsableAttributes
) и отметьте другие свойства.
Обратите внимание, что другой вариант заключается в создании настраиваемой вкладки, но в моем опыте это просто хит.
Вот пример использования TypeConverter
, который используется PropertyGrid
, но не большинством других привязок; он работает, имея собственный преобразователь типов, который исключает определенное свойство по имени, но вы также можете использовать что-то вроде Attribute.IsDefined
для маскировки:
using System.Windows.Forms;
using System;
using System.Linq;
using System.ComponentModel;
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Data data = new Data { Name = "the name", Value = "the value" };
using (Form form = new Form
{
Controls =
{
new PropertyGrid {
Dock = DockStyle.Fill,
SelectedObject = data
},
new TextBox {
Dock = DockStyle.Bottom,
DataBindings = { {"Text", data, "Value"}, }
},
new TextBox {
Dock = DockStyle.Bottom,
DataBindings = { {"Text", data, "Name"}, }
}
}
})
{
Application.Run(form);
}
}
}
[TypeConverter(typeof(DataConverter))]
class Data
{
class DataConverter : ExpandableObjectConverter
{
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
{
var props = base.GetProperties(context, value, attributes);
return new PropertyDescriptorCollection(
(from PropertyDescriptor prop in props
where prop.Name != "Value"
select prop).ToArray(), true);
}
}
public string Value { get; set; }
public string Name { get; set; }
}