MVVMCrossでは、1回限りのバインディングと一元配置バインディングは、異なる目的に役立つ2つの異なるデータ結合モードです。
1回限りのバインディング
1回限りのバインディングは、バインディングソースが最初に設定されている場合、ビューモデルからビューへのデータを1回だけ転送します。この最初の転送の後、バインディングはViewModelの変化を監視せず、バインディングソース自体がリセットされない限り、ビューを更新しません。このモードは、設定可能なフィールドに役立ちますが、設定後に頻繁に変更されないフィールドに役立ちます。たとえば、MVVMCrossでは、ユーザーが言語を一度選択するのが一般的であり、その後頻繁に変更されないため、言語ファイルから静的テキストを設定するために1回限りのバインディングが使用されます[1]。
###一元配置バインディング
一方、一方向の結合は、ViewModelの対応するプロパティが変更されるたびに、ビューを継続的に更新します。これは、ViewModelのプロパティの変更が自動的にビューに反映されることを意味します。ただし、ビューに直接行われた変更は、ViewModelに影響しません。一方向のバインディングは、センサーデータやネットワークフィードなどの動的なソースから生じるデータを表示する場合に役立ちます。ビューは、ビューモデルの最新の状態を反映する必要がありますが、更新を返す必要はありません[1]。
###キーの違い
- 頻度の更新:1回限りのバインディングは、セットアップ時にビューを1回だけ更新しますが、一方向のバインディングは、ビューモデルが変更されるたびにビューを継続的に更新します。
- 監視の変更:1回限りのバインディングでは、最初のセットアップ後のビューモデルの変更を監視しませんが、一方向のバインディングはビューモデルの変更について積極的に耳を傾けます。
- ユースケース:一度に静的または頻繁にデータを変更するのに最適ですが、ビューモデルに影響を与えるユーザーインタラクションなしでリアルタイムで表示する必要がある動的データにより、一方向は適しています。
要約すると、両方のモードがViewModelからViewにデータを転送しますが、1回限りのバインディングは1回だけで行い、変更を監視しませんが、一方向の結合はViewModelの変更に基づいてビューを継続的に更新します。
引用:[1] https://www.mvvmcross.com/documentation/fundamentals/dataバインディング
[2] https://blog.ostebaronen.dk/2018/01/mvvmcross binding-target.html
[3] https://stackoverflow.com/questions/41768962/mvvvmcross-default-mode-ins-in-a-project
[4] https://www.mvvmcross.com/documentation/fundmentals/viewmodel-lifecycle
[5] https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/data binding/binding-mode?view=net-maui-9.0
[6] https://yanxiaodi.gitbook.io/xamarin-mvvvcross handbook/using-mvvvmcross-create-your-first-xamarin-app/creating-android-project/understanding-the-data-syntax
[7] https://www.mvvmcross.com/documentation/advanced/custom-dataバインディング
[8] https://github.com/mvvmcross/mvvmcross/issues/29
[9] https://stackoverflow.com/questions/27803448/data-binding-one-vs-two-way
[10] https://stackoverflow.com/questions/48910503/binding-mode-onetime-in-mvxrecyclerview
[11] https://www.reddit.com/r/-javascript/comments/v993r4/askjs_why_is_oneway_bindien_better_than_twoway/