添付プロパティ

サンプルのダウンロードサンプルのダウンロード

添付プロパティを使用すると、オブジェクトは、独自のクラスで定義されていないプロパティの値を割り当てることができます。 たとえば、子要素は添付プロパティを使用して、ユーザー インターフェイスでの表示方法を親要素に通知できます。 コントロールをGrid使用すると、 プロパティと 添付プロパティを設定することで、子の行とGrid.Column列をGrid.Row指定できます。 Grid.Row および Grid.Column は、それ自体ではなく、 の Grid子要素に設定されるため、添付プロパティです Grid

バインド可能なプロパティは、次のシナリオで添付プロパティとして実装する必要があります。

  • 定義クラス以外のクラスで使用できるプロパティ設定メカニズムが必要な場合。
  • クラスが他のクラスと簡単に統合する必要があるサービスを表す場合。

バインド可能なプロパティの詳細については、「 バインド可能なプロパティ」を参照してください。

添付プロパティを作成する

添付プロパティを作成するプロセスは次のとおりです。

  1. BindablePropertyメソッド オーバーロードのいずれかを使用してインスタンスをCreateAttached作成します。
  2. 添付プロパティのアクセサーとして PropertyName メソッドと SetPropertyName メソッドを指定staticGetします。

プロパティを作成する

他の型で使用する添付プロパティを作成する場合、プロパティが作成されるクラスは から BindableObject派生する必要はありません。 ただし、アクセサーの ターゲット プロパティは、 である必要があります。または から BindableObject派生する必要があります。

添付プロパティは、 型BindablePropertyのプロパティをpublic static readonly宣言することで作成できます。 バインド可能なプロパティは、いずれかのメソッド オーバーロードの戻り値に設定する BindableProperty.CreateAttached 必要があります。 宣言は、所有するクラスの本体内にある必要がありますが、メンバー定義の外部にある必要があります。

重要

添付プロパティの名前付け規則は、添付プロパティ識別子がメソッドで CreateAttached 指定されたプロパティ名と一致する必要があり、"Property" が追加されていることです。

次のコードは、添付プロパティの例を示しています。

public static readonly BindableProperty HasShadowProperty =
  BindableProperty.CreateAttached ("HasShadow", typeof(bool), typeof(ShadowEffect), false);

これにより、 型boolの という名前HasShadowPropertyの添付プロパティが作成されます。 プロパティは クラスによって ShadowEffect 所有され、既定値 falseは です。

作成時に指定できるパラメーターなど、バインド可能なプロパティの作成の詳細については、「 バインド可能なプロパティを作成する」を参照してください。

アクセサーを作成する

添付プロパティのアクセサーとして Static GetPropertyName メソッドと SetPropertyName メソッドが必要です。それ以外の場合、プロパティ システムは添付プロパティを使用できません。 PropertyName アクセサーはGet、次のシグネチャに準拠している必要があります。

public static valueType GetPropertyName(BindableObject target)

PropertyName アクセサーはGet、添付プロパティの対応するBindablePropertyフィールドに含まれる値を返す必要があります。 これを実現するには、 メソッドを GetValue 呼び出し、値を取得するバインド可能なプロパティ識別子を渡し、結果の値を必要な型にキャストします。

PropertyName アクセサーはSet、次のシグネチャに準拠している必要があります。

public static void SetPropertyName(BindableObject target, valueType value)

PropertyName アクセサーはSet、添付プロパティの対応するBindablePropertyフィールドの値を設定する必要があります。 これを実現するには、 メソッドを SetValue 呼び出し、値を設定するバインド可能なプロパティ識別子と設定する値を渡します。

両方のアクセサーの 場合、ターゲット オブジェクトは のであるか、 から BindableObject派生している必要があります。

次のコード例は、添付プロパティのアクセサーを HasShadow 示しています。

public static bool GetHasShadow (BindableObject view)
{
  return (bool)view.GetValue (HasShadowProperty);
}

public static void SetHasShadow (BindableObject view, bool value)
{
  view.SetValue (HasShadowProperty, value);
}

添付プロパティを使用する

添付プロパティが作成されると、XAML またはコードから使用できます。 XAML では、これはプレフィックスを持つ名前空間を宣言し、名前空間宣言は共通言語ランタイム (CLR) 名前空間名、および必要に応じてアセンブリ名を示すことで実現されます。 詳細については、「 XAML 名前空間」を参照してください。

次のコード例は、カスタム型を参照するアプリケーション コードと同じアセンブリ内で定義される添付プロパティを含むカスタム型の XAML 名前空間を示しています。

<ContentPage ... xmlns:local="clr-namespace:EffectsDemo" ...>
  ...
</ContentPage>

名前空間宣言は、次の XAML コード例に示すように、特定のコントロールに添付プロパティを設定するときに使用されます。

<Label Text="Label Shadow Effect" local:ShadowEffect.HasShadow="true" />

これと同じ C# コードの例は次のとおりです。

var label = new Label { Text = "Label Shadow Effect" };
ShadowEffect.SetHasShadow (label, true);

スタイルを使用して添付プロパティを使用する

添付プロパティは、スタイルによってコントロールに追加することもできます。 次の XAML コード例は、コントロールに適用できる添付プロパティをHasShadow使用する明示的なスタイルをLabel示しています。

<Style x:Key="ShadowEffectStyle" TargetType="Label">
  <Style.Setters>
    <Setter Property="local:ShadowEffect.HasShadow" Value="true" />
  </Style.Setters>
</Style>

Style は、次のコード例に示すように、 マークアップ拡張を使用して自身の StaticResource プロパティを Style インスタンスに設定することで、StyleLabel に適用できます。

<Label Text="Label Shadow Effect" Style="{StaticResource ShadowEffectStyle}" />

スタイルについて詳しくは、「Styles」(スタイル) をご覧ください。

高度なシナリオ

添付プロパティを作成する場合、高度な添付プロパティ シナリオを有効にするために設定できる省略可能なパラメーターがいくつかあります。 これには、プロパティの変更の検出、プロパティ値の検証、プロパティ値の強制化が含まれます。 詳細については、「 高度なシナリオ」を参照してください。