次のようなWPFのさまざまなデータバインディングモードを理解していません。
- 一方通行
- 双方向
- 一度
- 等...
これらの各モードはどういう意味ですか?
それらはいつ使用されるべきですか?
回答:
OneWay
:バインドされたプロパティでユーザーインターフェイスを更新する場合に使用します。TwoWay
:これは、組み合わせた場合と同じ動作をOneWay
しOneWayToSource
ます。バインドされたプロパティはユーザーインターフェイスを更新し、ユーザーインターフェイスの変更はバインドされたプロパティを更新します(たとえば、TextBox
またはでこれを使用しCheckbox
ます)。OneTime
:これは、OneWay
ユーザーインターフェイスを1回だけ更新することを除いて、同じ動作をします。これはバインディングのデフォルトの選択である必要があります(さまざまな理由でここでは詳しく説明しません)。実際に追加機能が必要な場合にのみ、他のタイプのバインディングを使用する必要があります。OneWayToSource
:これは逆ですOneWay
-ユーザーインターフェイスの値の変更により、バインドされたプロパティが更新されます。何も指定しない場合、動作は使用しているコントロールによって異なります。
詳細についてはBindingMode
、MSDNの列挙型を参照してください。
バインディングは、次の2つのエンティティで構成されます。
ターゲットはDependencyObject
(バインドが機能するため)DependencyObject
である必要があり、ソースはのいずれかであるか、変更されたことについてWPFバインディングシステムを模倣するメカニズム(実装INotifyPropetyChnaged
インターフェイス)を備えている必要があります。
MVVMは、ViewModelプロジェクトにView関連の参照がないことを推奨しINotifyPropertyChanged
ているため、インターフェイスを使用して、ソースオブジェクトがWPFバインディングによって認識されるようにすることをお勧めします。SourceのプロパティとTargetのプロパティの間でバインドが発生します(である必要がありますDependencyProperty
)。たとえばTextProperty
、TextBox
クラスのはUserName
、ビューモデルの(たとえば)プロパティへのDataBoundです。WPFバインディングには、4種類のバインディングがあります。特に指定しない限り、バインディングはUIスレッドで実行されることに注意してください。
UserName
プロパティをプログラムで変更すると、テキストボックスに反映されます。バインディングシステムはソースのみの変更を監視するため、これは中程度のコストです。TextProperty
とUserName
プロパティの両方が同期されたままになり、一方が変更されると相互に更新されます。バインディングシステムは両側の変更を監視する必要があるため、これは最もコストがかかります。TextProperty
と、UserName
プロパティは変更された値を取得します。バインディングシステムはターゲットのみの変更を監視するため、これも中程度のコストです。Label
、TextBlock
など何も言及しない場合、すべてのターゲットプロパティには、それ自体に関連付けられたデフォルトのバインディングモードがあります。たとえば、TextProperty
のTextBox
デフォルトのバインディングモードはですTwoWay
。以下のためTextProperty
のTextBlock
それは1つの方法です。
特にUIに多数のコントロールがある場合は、アプリケーションの待ち時間を短縮するのに役立つため、適切なモードを選択することをお勧めします。
MVVMの詳細については、私が書いた記事をご覧ください。