次の方法で共有


データ バインディング

サンプルを参照します。 サンプルを参照する

.NET マルチプラットフォーム アプリ UI (.NET MAUI) アプリは 1 つ以上のページで構成され、各ページには通常、 ビューと呼ばれる複数のユーザー インターフェイス オブジェクトが含まれています。 アプリの主なタスクの 1 つは、これらのビューの同期を維持し、それらが表すさまざまな値または選択を追跡することです。 多くの場合、ビューは基になるデータ ソースの値を表し、ユーザーはこれらのビューを操作してそのデータを変更します。 ビューが変更されると、基になるデータはその変更を反映する必要があります。また、基になるデータが変更された場合も同様に、その変更をビューに反映する必要があります。

これらの変更を正常に処理するには、これらのビューまたは基になるデータの変更をアプリに通知する必要があります。 一般的な解決策は、変更が発生したときに通知するイベントを定義することです。 その後、これらの変更を通知するイベント ハンドラーをインストールできます。 あるオブジェクトから別のオブジェクトにデータを転送することで応答します。 ただし、多くのビューがある場合は、多数のイベント ハンドラーも必要です。その結果、定型コードが多数発生します。

データ バインディングは、このタスクを自動化し、イベント ハンドラーを不要にレンダリングします。 データ バインディングは XAML またはコードで実装できますが、XAML ではコードビハインド ファイルのサイズを小さくするのに役立ちます。 イベント ハンドラーの手続き型コードを宣言型コードまたはマークアップに置き換えることで、アプリが簡略化され、明確になります。

したがって、データ バインディングは、2 つのオブジェクトのプロパティをリンクして、1 つのプロパティの変更がもう一方のプロパティに自動的に反映されるようにする手法です。 データ バインディングに関係する 2 つのオブジェクトの 1 つは、ほとんどの場合、 View から派生し、ページのビジュアル インターフェイスの一部を形成する要素です。 もう 1 つのオブジェクトは次のいずれかです。

  • 別の View 派生型(通常は同じページ内)。
  • コード ファイル内のオブジェクト。

2つのView派生物間のデータバインディングは、明確さと簡潔さを目的として、これらの記事で頻繁に示されています。 ただし、 View とその他のオブジェクト間のデータ バインディングにも同じ原則を適用できます。 Model-View-ViewModel (MVVM) アーキテクチャを使用してアプリケーションをビルドする場合、基になるデータを持つクラスはビューモデルと呼ばれることがよくあります。

Important

.NET MAUI は、UI スレッドへのバインドの更新をマーシャリングします。 MVVM を使用すると、.NET MAUI のバインド エンジンによって UI スレッドに更新が適用され、データ バインドビューモデルプロパティを任意のスレッドから更新できます。

Warnung

自動マーシャリングは、 INotifyPropertyChanged.PropertyChanged 通知にのみ適用されます。 ObservableCollection<T> 変更 (追加、削除、クリアなど) は、UI スレッドに自動的にマーシャリングされません。 バックグラウンド スレッドからこれらのメソッドを呼び出すと、そのスレッドで CollectionChanged が発生し、UI 例外やレイアウトの破損が発生する可能性があります。

コレクションの変更を常にメイン スレッドにディスパッチします。

// Option 1: dispatch mutations to the main thread
await Task.Run(async () =>
{
    var newItems = await api.FetchItemsAsync();
    MainThread.BeginInvokeOnMainThread(() =>
    {
        foreach (var item in newItems)
            Items.Add(item);
    });
});

// Option 2: replace the whole collection (PropertyChanged is auto-marshaled)
var newItems = await Task.Run(() => api.FetchItemsAsync());
Items = new ObservableCollection<MyItem>(newItems); // safe — raises PropertyChanged