You can group properties by category by adding a Category attribute to each property on the object being browsed (note that the Category attribute is defined in the System.ComponentModel namespace, in the System.Windows assembly). By default the members in the list will be listed alphabetically and uncategorized. By adding categories you can better organize members by listing related members together.
Continuing with our example, here's a revised version of the Customer class which includes categories:
Public Class Customer
Private _Name As String
<Category("Contact")> _
<DisplayName("Customer Name")> _
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Private _EMail As String
<Category("Contact")> _
<DisplayName("e-Mail address")> _
Public Property EMail() As String
Get
Return _EMail
End Get
Set(ByVal value As String)
_EMail = value
End Set
End Property
Private _Address As String
<Category("Contact")> _
Public Property Address() As String
Get
Return _Address
End Get
Set(ByVal value As String)
_Address = value
End Set
End Property
Private _CustomerSince As DateTime
<Category("History")> _
<DisplayName("Customer Since")> _
Public Property CustomerSince() As DateTime
Get
Return _CustomerSince
End Get
Set(ByVal value As DateTime)
_CustomerSince = value
End Set
End Property
Private _SendNewsletter As Boolean
<Category("Contact")> _
<DisplayName("Send Newsletter")> _
Public Property SendNewsletter() As Boolean
Get
Return _SendNewsletter
End Get
Set(ByVal value As Boolean)
_SendNewsletter = value
End Set
End Property
Private _PointBalance As System.Nullable(Of Integer)
<Category("History")> _
<DisplayName("Point Balance")> _
Public Property PointBalance() As System.Nullable(Of Integer)
Get
Return _PointBalance
End Get
Set(ByVal value As System.Nullable(Of Integer))
_PointBalance = value
End Set
End Property
End Class
•C#
public class Customer
{
[Category("Contact")]
[DisplayName("Customer Name")]
public string Name { get; set; }
[Category("Contact")]
[DisplayName("e-Mail address")]
public string EMail { get; set; }
[Category("Contact")]
public string Address { get; set; }
[Category("History")]
[DisplayName("Customer Since")]
public DateTime CustomerSince { get; set; }
[Category("Contact")]
[DisplayName("Send Newsletter")]
public bool SendNewsletter { get; set; }
[Category("History")]
[DisplayName("Point Balance")]
public int? PointBalance { get; set; }
}
And here is the result of this change:
Notice how properties are neatly grouped by category. Each group can be expanded and collapsed, making it easier for the user to find specific properties.
You can also use the DefaultCategoryName property to set the name of a default category which will contain all the properties that have no other category defined.