次の方法で共有


BindableObject 拡張機能

BindableObject 拡張機能には、BindableObject 上での Binding の構成をサポートする一連の拡張メソッドが用意されています。

この拡張機能では、次のメソッドを利用できます。

バインド

Bind メソッドでは、Binding のセットアップに関してさまざまな利便性を提供する多数のオーバーロードを利用できます。 .NET MAUI アプリケーション内の Binding データが持つ可能性について詳しくは、Microsoft ドキュメントを参照してください。

Bind メソッドには多くのオーバーロードがあります。

一方向バインド

RegistrationCode と呼ばれるビュー モデル (RegistrationViewModel) プロパティから LabelText プロパティへの一方向バインドは、次のように作成できます。

new Entry()
    .Bind(Label.TextProperty, 
            getter: static (RegistrationViewModel vm) => vm.RegistrationCode)

双方向バインド

RegistrationCode と呼ばれるビュー モデル (RegistrationViewModel) プロパティと EntryText プロパティとの双方向バインドは、次のように作成できます。

new Entry()
    .Bind(Entry.TextProperty,
            getter: static (RegistrationViewModel vm) => vm.RegistrationCode,
            setter: static (RegistrationViewModel vm, string code) => vm.RegistrationCode = code)

複合 (入れ子にされた) バインド

プロパティ内のプロパティにバインドする場合 ("入れ子にされたバインド" とも呼ばれます)、handlers パラメーターが必須です。 handler パラメーターを使用する場合は、複合バインド チェーン内の各プロパティへの参照が必須です。

以下の例の加えて、CommunityToolkit.Maui.Markup の単体テストに関するページにも複合バインドの例があります。

複合 (入れ子にされた) バインドの例

次の ViewModel クラスを使用すれば、handlers パラメーターによって、ViewModel.NestedObject.Text との入れ子にされた双方向バインドを直接作成できます。

new Entry().Bind(
    Entry.TextProperty,
    getter: static (ViewModel vm) => vm.NestedObject.Text,
    handlers: new (Func<ViewModel, object?>, string)[]
             {
                (vm => vm, nameof(ViewModel.NestedObject)),
                (vm => vm.NestedObject, nameof(ViewModel.NestedObject.Text)),
             },
    setter: static (ViewModel vm, string text) => vm.NestedObject.Text = text);
class ViewModel
{
    public NestedObject NestedObject { get; set; } = new();

    public required string Text { get; set; }
}

class NestedObject
{
    public required string Text { get; set; }
}

既定のプロパティ

Bind メソッドは、バインドを設定するプロパティを指定せずに呼び出すことができます。この場合に利用される既定値は、GitHub リポジトリにある完全なリストを含むライブラリによって提供されます。

Entry の場合、バインドする既定のプロパティは text プロパティです。 したがって、上記の例は次のように記述できます。

new Entry().Bind(nameof(ViewModel.RegistrationCode))

警告

このアプローチをとると、ある程度のリフレクションが使用されることから、明示的プロパティのアプローチほどのパフォーマンスは得られません。

値の変換

Bind メソッドを使用すると、開発者は、バインドで使用する Converter を指定することも、単に、インライン変換を使用するメカニズムを指定することもできます。

コンバーター
new Entry()
    .Bind(Entry.TextProperty,
            getter: static (RegistrationViewModel vm) => vm.RegistrationCode,
            converter: new TextCaseConverter { Type = TextCaseType.Upper });

完全な使用方法に関するドキュメントについては、「TextCaseConverter」を参照してください。

インライン変換
new Entry()
    .Bind(Entry.TextProperty,
            getter: static (RegistrationViewModel vm) => vm.RegistrationCode,
            convert: (string? text) => text?.ToUpperInvariant());

複数のバインド

複数のバインドは、IMultiValueConverter を利用して集約できます。

convert パラメーターは、複数のバインドを目的の結果に変換するために必要とされる Func です。

new Label()
    .Bind(Label.TextProperty,
            binding1: new Binding(nameof(ViewModel.IsBusy)),
            binding2: new Binding(nameof(ViewModel.LabelText)),
            convert: ((bool IsBusy, string LabelText) values) => values.IsBusy ? string.Empty : values.LabelText)

BindCommand

BindCommand メソッドを使用すると、GitHub リポジトリにある完全なリストを含むライブラリによって提供される既定値へのバインドを容易に構成することができます。

Button の場合、バインドする既定のコマンドは Command プロパティです。 そのため、次の例では、そのプロパティへのバインドを設定します。

new Button().BindCommand(static (ViewModel vm) => vm.SubmitCommand);

上記の場合は、次のように記述することもできます。

Note

既定のコマンドを使用した結果、目的のコマンドにバインドされない場合は、Bind メソッドを使用できます。

new Button()
    .Bind(Entry.CommandProperty,
            getter: static (RegistrationViewModel vm) => vm.SubmitCommand,
            mode: BindingMode.OneTime);

ジェスチャ バインド

ジェスチャ バインドを使用すると、ClickGestureRecognizerSwipeGestureRecognizerTapGestureRecognizer を作成し、IGestureRecognizer を実装する任意の要素にそれをアタッチして、ViewModel で ICommand にバインドできます。

BindClickGesture

次の例では、アクティブにするのに 2 クリックを必要とする ClickGestureRecognizer を作成し、それを Label にアタッチして、ViewModel で ClickCommand と呼ばれる ICommand プロパティにバインドする方法を示します。

new Label()
    .BindClickGesture(
        static (ViewModel vm) => vm.ClickCommand,
        commandBindingMode: BindingMode.OneTime,
        numberOfClicksRequired: 2));

BindSwipeGesture

次の例では、SwipeGestureRecognizer (その SwipeDirection として SwipeDirection.Up を、その Threshold として最小 200 ポイントの距離を必要とする) を作成し、それを Label にアタッチし、ViewModel で SwipeCommand と呼ばれる ICommand プロパティにバインドする方法を示します。

new Label()
    .BindSwipeGesture(
        static (ViewModel vm) => vm.SwipeCommand,
        commandBindingMode: BindingMode.OneTime,
        direction: SwipeDirection.Up,
        threshold: 200);

BindTapGesture

次の例では、アクティブにするのに 2 タップを必要とする ClickGestureRecognizer を作成し、それを Label にアタッチして、ViewModel で TapCommand と呼ばれる ICommand プロパティにバインドする方法を示します。

new Label()
    .BindTapGesture(
        static (ViewModel vm) => vm.TapCommand,
        commandBindingMode: BindingMode.OneTime,
        numberOfTapsRequired: 2));

AppThemeBinding

AppThemeBinding メソッドを使用すると、アプリケーション AppTheme が変更されたときに、そのテーマに適切な値が使用されるように、ライトおよびダーク値を BindableProperty に割り当てることができます。

次の例では、アプリケーションがライト テーマで実行されている場合は Text コントロールの Label プロパティに黒色を割り当て、ダーク テーマで実行されている場合は白色を割り当てます。

new Label().AppThemeBinding(Label.TextColorProperty, Colors.Black, Colors.White);

Note

Color プロパティを処理する場合は、より具体的なメソッドがあります。 AppThemeColorBinding は、実行する基になる動作は AppThemeBinding と同じですが、Color パラメーターのセットを必要とします。

詳細については、テーマに関するドキュメントを参照してください。

これらの拡張メソッドの動作例については、.NET MAUI Community Toolkit サンプル アプリケーションに関するページを参照してください。

API

BindableObject 拡張メソッドのソース コードについては、.NET MAUI Community Toolkit GitHub リポジトリに関するページを参照してください。