このトピックでは、プロパティの既定値を定義する方法と、オプション メニューをカスタマイズする方法を説明します。
このトピックをより理解するために、以下のトピックを参照することをお勧めします。
このトピックは、以下のセクションで構成されます。
xamPropertyGrid コントロールのプロパティ値のリセット機能では、既定値が定義されている場合、ユーザーは各プロパティを既定値とは独立させリセットすることができます。各プロパティの値の右側には、小さなグリフがあります。以下のスクリーンショットは、リセット値のグリフの状態を示しています。
注:
リセット グリフをクリックすると、オプション メニューが表示されます。既定では、このメニューにプロパティ値をリセットするためのオプションが 1 つのみ存在します。ただし、 xamPropertyGrid の OptionsMenu プロパティを任意の ContextMenu
に設定すると、カスタム オプション メニューを指定できます。カスタムな ContextMenu
の DataContext
は、現在のプロパティに関連付けられた PropertyGridPropertyItem に自動的に設定されます。
以下のスクリーンショットは、「塗りつぶされた四角」のリセット プロパティ値のグリフをクリックしたときに表示される既定のオプションのメニューを示しています。
以下の表では、プロパティの既定値を定義する方法を簡単に説明しています。詳細は、表の後に記載されています。
「DefaultValue」属性を使用して、プロパティの既定値をコードで定義することができます。
以下のコードは、「DefaultValue」属性を使用して、プロパティの既定値を定義する方法を示します。
C# の場合:
public class Person
{
[DefaultValue("first-name-default-value")]
public string FirstName { get; set; }
…
}
Visual Basic の場合:
Public Class Person
<DefaultValue("first-name-default-value")> _
Public Property FirstName() As String
Get
Return m_FirstName
End Get
Set
m_FirstName = Value
End Set
End Property
Private m_FirstName As String
End Class
プロパティに「DefaultValue」属性で表すことができない既定値がある場合は、Reset と ShouldSerialize を使用してプロパティの既定値をコードで設定することができます。
プレフィックスが「Reset」で戻り型が void のプロパティと同じ名前にリセットする各プロパティに対して、reset メソッドを定義します。このメソッドを使用して、プロパティの値を既定値に設定します。
プレフィックスが「ShouldSerialize」で戻り型が bool
のプロパティと同じ名前にリセットする各プロパティに対して、ShoudSerialize メソッドを定義します。このメソッドは、プロパティ値がリセットできる場合、true
を返します。
以下のコードは、メソッドを使用してプロパティの既定値を定義する方法を示します。
C# の場合:
public class Person : INotifyPropertyChanged
{
private string firstNameDefault = "first-name-default-value";
public string FirstName { get; set; }
public void ResetFirstName()
{
this.FirstName = this.firstNameDefault;
this.PropertyChange("FirstName");
}
public bool ShouldSerializeFirstName()
{
return !this.firstNameDefault.Equals(this.FirstName);
}
…
public event PropertyChangedEventHandler PropertyChanged;
private void PropertyChange(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Visual Basic の場合:
Public Class Person Implements INotifyPropertyChanged
Private firstNameDefault As String = "first-name-default-value"
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 Sub ResetFirstName()
Me.FirstName = Me.firstNameDefault
Me.PropertyChange("FirstName")
End Sub
Public Function ShouldSerializeFirstName() As Boolean
Return Not Me.firstNameDefault.Equals(Me.FirstName)
End Function
…
Public Event PropertyChanged As PropertyChangedEventHandler
Private Sub PropertyChange(propertyName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
End Class
既定のオプション メニューは、各プロパティ値の右側にあるグリフをクリックすると表示されます。このメニューのオプションは、「リセット」 (プロパティを既定値にリセット) のみです。xamPropertyGrid の OptionsMenu プロパティを変更すると、このメニューをカスタマイズできます。ContextMenu
型の新しいインスタンスを設定することもできます。カスタムな ContextMenu の DataContext は、現在のプロパティに関連付けられた PropertyGridPropertyItem に自動的に設定されます。
以下のコード例は、既定の「リセット」オプションを使用してオプション メニューを定義する方法を示します。また、現在のプロパティ名とプロパティ値を表示する複数のオプションも示します。
XAML の場合:
<ig:XamPropertyGrid x:Name="xamPropertyGrid1">
<ig:XamPropertyGrid.OptionsMenu>
<ContextMenu>
<MenuItem Header="Custom Reset Value">
<ig:Commanding.Command>
<igPrim:PropertyGridPropertyItemCommandSource
EventName="Click"
CommandType="ResetPropertyValue"
ParameterBinding="{Binding}" />
</ig:Commanding.Command>
</MenuItem>
<MenuItem Header="Obtain Property Name" Click="MenuItemName_Click" />
<MenuItem Header="Obtain Property Value" Click="MenuItemValue_Click" />
</ContextMenu>
</ig:XamPropertyGrid.OptionsMenu>
</ig:XamPropertyGrid>
C# の場合:
private void MenuItemName_Click(object sender, RoutedEventArgs e)
{
MenuItem mi = sender as MenuItem;
PropertyGridPropertyItem pgpi = mi.DataContext as PropertyGridPropertyItem;
MessageBox.Show(pgpi.PropertyName, "Property Name");
}
private void MenuItemValue_Click(object sender, RoutedEventArgs e)
{
MenuItem mi = sender as MenuItem;
PropertyGridPropertyItem pgpi = mi.DataContext as PropertyGridPropertyItem;
MessageBox.Show(pgpi.Value.ToString(), "Property Value");
}
Visual Basic の場合:
Private Sub MenuItemName_Click(sender As Object, e As RoutedEventArgs)
Dim mi As MenuItem = TryCast(sender, MenuItem)
Dim pgpi As PropertyGridPropertyItem = TryCast(mi.DataContext, PropertyGridPropertyItem)
MessageBox.Show(pgpi.PropertyName, "Property Name")
End Sub
Private Sub MenuItemValue_Click(sender As Object, e As RoutedEventArgs)
Dim mi As MenuItem = TryCast(sender, MenuItem)
Dim pgpi As PropertyGridPropertyItem = TryCast(mi.DataContext, PropertyGridPropertyItem)
MessageBox.Show(pgpi.Value.ToString(), "Property Value")
End Sub
このトピックの追加情報については、以下のトピックも合わせてご参照ください。