このトピックでは、コントロールが展開可能なプロパティを識別し表示する方法を説明します。
本トピックの理解を深めるために、以下のトピックを参照することをお勧めします。
このトピックは、以下のセクションで構成されます。
xamPropertyGrid コントロールは展開可能なプロパティの表示をサポートします。このプロパティは、展開可能なプロパティ項目の左端のエキスパンダー グリフをクリックすると表示される、兄弟項目/要素を含みます。プロパティは一定の条件を満たせば展開可能なプロパティとみなされます。左記で詳細を説明します。
パブリック プロパティを持つ型 - 1 つ以上のパブリック プロパティ (Button
インスタンスの Style
プロパティなど) を公開する、または ExpandableObjectConverter
属性を持つ型。展開されると、 xamPropertyGrid は型のプロパティの項目の下位リストを表示します。
型にパラメータなしのパブリック コンストラクタが設定され、現在のプロパティ値が null の場合、 xamPropertyGrid はプロパティ項目の右端にプラス記号の付いたボタンを表示します。このボタンをクリックすると、型のインスタンスが作成されます。
次のスクリーンショットは、 xamPropertyGrid で描画されたパブリック プロパティ (ContextMenu) を持つ型を示しています。
コレクション型 - ICollection
、IList
または IEnumerable
を実装する型です。展開されると、 xamPropertyGrid は要素の下位リストを表示します。
リストが ICollection<T>
で T
にパラメータなしのパブリックコンストラクタが設定され、リストが変更可能な場合、 xamPropertyGrid はリストの右端にプラス記号の付いたボタンを表示します。このボタンをクリックすると、型 T
のエントリがリストに追加されます。
リストが変更可能な場合、 xamPropertyGrid は各リスト要素の右端にマイナス記号の付いたボタンを表示します。このボタンをクリックすると、当該要素が削除されます。
次のスクリーンショットは、 xamPropertyGrid で描画されたリスト型のプロパティ (ColumnDefinitions) を示しています。
展開可能なプロパティ/コレクションの展開/縮小ハンドル
展開可能なプロパティ/コレクションのプロパティ/要素
要素をリストに追加するためのプラス ボタン
特定の要素をリストから削除するためのマイナス ボタン
デフォルトでは、 xamPropertyGrid コントロールはコレクションの型および要素のカウントを値の列に描画します。以下の手順を実行して、値を変更します:
System.ComponentModel.TypeConverter
から派生するクラスを作成します。
ConvertTo
メソッドをオーバーライドして使用する文字列値を返します。
コレクション プロパティを TypeConverter
属性で装飾して、手順 1 で作成したクラスの型を引数として追加します。
以下のスクリーンショットは、左にデフォルトのコレクション描画、右にカスタマイズされた描画を示しています:
以下のコード スニペットは、上記の結果になるためのコードを示します。
Visual Basic の場合:
Public Class CustomTypeConverter
Inherits TypeConverter
Public Overrides Function ConvertTo( _
context As ITypeDescriptorContext, _
culture As CultureInfo, _
value As [Object], _
destinationType As Type) As Object
Return "Employee's Collection"
End Function
End Class
…
<TypeConverter(GetType(CustomTypeConverter))> _
Public Property Customers() As List(Of Customer)
Get
Return m_Customers
End Get
Set
m_Customers = Value
End Set
End Property
Private m_Customers As List(Of Customer)
C# の場合:
public class CustomTypeConverter : TypeConverter
{
public override object ConvertTo(
ITypeDescriptorContext context,
CultureInfo culture,
Object value,
Type destinationType)
{
return "Employee's Collection";
}
}
…
[TypeConverter(typeof(CustomTypeConverter))]
public List<Customer> Customers
{
get; set;
}
デフォルトでは、 xamPropertyGrid コントロールはコレクションの要素を角括弧のインデックスとして描画します ([0]、[1]、[2]…)。以下の手順を実行して、それをカスタマイズします:
コレクションが System.ComponentModel.ICustomTypeDescriptor
インターフェースを実装するようにします。
このインターフェースから実装する中心的なメソッドは GetProperties()
メソッドです。このメソッドは、System.ComponentModel.PropertyDescriptor
型から拡張されるオブジェクトのコレクションを返します。
PropertyDescriptor
の DisplayName
文字列プロパティをオーバーライドして、コレクションの各要素にカスタムの表示名を与えます。
注:
注:
以下のスクリーンショットの左は、デフォルトのコレクション要素の描画、右はカスタマイズされた要素の描画を示しています:
以下のコード スニペットは、上記の結果になるためのコードを示します。
Visual Basic の場合:
Public Class Employee
Public Property FirstName() As String
Get
Return m_FirstName
End Get
Set
m_FirstName = Value
End Set
End Property
Private m_FirstName As String
Public Property LastName() As String
Get
Return m_LastName
End Get
Set
m_LastName = Value
End Set
End Property
Private m_LastName As String
End Class
Public Class EmployeePropertyDescriptor
Inherits PropertyDescriptor
Private collection As EmployeeCollection
Private index As Integer
Public Sub New(col As EmployeeCollection, i As Integer)
Me.collection = col
Me.index = i
End Sub
Public Overrides ReadOnly Property DisplayName() As String
Get
Dim emp As Employee = Me.collection(index)
Return emp.FirstName & " " & Convert.ToString(emp.LeftName)
End Get
End Property
End Class
Public Class EmployeeCollection
Inherits List(Of Employee)
Implements ICustomTypeDescriptor
Public Function GetProperties() As PropertyDescriptorCollection
Dim pds As New PropertyDescriptorCollection(Nothing)
For i As Integer = 0 To Me.Count - 1
Dim pd As New EmployeePropertyDescriptor(Me, i)
pds.Add(pd)
Next
Return pds
End Function
End Class
C# の場合:
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class EmployeePropertyDescriptor : PropertyDescriptor
{
private EmployeeCollection collection;
private int index;
public EmployeePropertyDescriptor(EmployeeCollection col, int i)
{
this.collection = col;
this.index = i;
}
public override string DisplayName
{
get
{
Employee emp = this.collection[index];
return emp.FirstName + " " + emp.LeftName;
}
}
}
public class EmployeeCollection : List<Employee>, ICustomTypeDescriptor
{
public PropertyDescriptorCollection GetProperties()
{
PropertyDescriptorCollection pds = new PropertyDescriptorCollection(null);
for (int i = 0; i < this.Count; i++)
{
EmployeePropertyDescriptor pd = new EmployeePropertyDescriptor(this, i);
pds.Add(pd);
}
return pds;
}
}
コレクションの型にも、パブリック プロパティを持つ型にも外部エディターを提供できます。外部エディターを提供すると、 xamPropertyGrid はプロパティ/コレクションの下位リストを描画しません。代わりに、外部のエディターが展開可能なプロパティ、またはコレクションのデータを描画します。
外部エディターのデータ テンプレートを作成する場合、データ テンプレートのデータ コンテキストが展開可能なプロパティに関連付けられた PropertyGridPropertyItem に設定されます。すなわち、PropertyGridPropertyItem
の Value プロパティにバインドして、元になるプロパティ値が得られます。
外部エディター提供の詳細について、 エディター定義の構成を参照してください。
このトピックの追加情報については、以下のトピックも合わせてご参照ください。