12

WPFでの双方向バインディングについてはよく耳にしますが、それを実現する方法や実際の意味については完全にはわかりません。

たくさんListViewのアイテムが入っています。ユーザーが新しいアイテムを選択するTextBoxと、アプリケーションのaはそのテキストを変更して、選択したアイテムのプロパティを表示します。

ただし、ユーザーがテキストボックスのテキストを変更した場合は、ListViewアイテムもすぐに更新する必要があります。これを実現するための「双方向バインディング」の魔法のWPF方法はありますか?

4

3 に答える 3

34

マークの答えは、あなたが望むことを達成する方法を示していますが、あなたはまた、「[双方向バインディング]を達成する方法とそれが実際に何を意味するか」についてより一般的に尋ねました。

一方向バインディングとは、バインディングターゲット(コントロールなど)がバインディングソース(ビジネスオブジェクトなど)からのデータを表示し、ビジネスオブジェクトの変更に応じて自身を更新することを意味しますが、コントロールへの変更はビジネスに伝播されません。物体。たとえば、Person.Nameが「bob」から「kate」に変更された場合、NameにバインドされたTextBlock.Textも「bob」から「kate」に変更されます。

双方向バインディングとは、ビジネスオブジェクトの変更がUIに反映されるだけでなく、ユーザーがUIで行った変更もビジネスオブジェクトに伝播されることを意味します。したがって、ユーザーがNameにバインドされたTextBox.Textを編集するとき、たとえば「kate」を「edmund」に変更すると、WPFはPerson.Nameプロパティも「edmund」に設定します。

これを実現するには、Binding宣言でMode=TwoWayを設定するだけです。一部のプロパティはデフォルトで双方向にバインドされます。たとえば、TextBox.TextはデフォルトでTwoWayをバインドします。そのため、MarkのコードはMode宣言を必要としません。さらに、Markが指摘しているように、既定では、WPFは、コントロールがフォーカスを失った場合にのみ、変更をビジネスオブジェクトに伝播します。同じプロパティにバインドされた2つのUI要素がある場合、これはそれらが同期していないように見えることを意味する可能性があります。その場合、UpdateSourceTriggerを使用して、プロパティが変更されるたびにWPFを強制的に伝播できます。

MSDNは、これをいくつかの明確な図で詳細に説明しています。WPFSDKのデータバインディングの概要を参照してください。

于 2010-02-01T21:54:36.453 に答える
11

まだ行っていない場合はINotifyPropertyChanged、バインド先のクラスに実装する必要があります。

また、ListBoxアイテムをすぐに更新したいという場合は、TextBox. デフォルトでは、TextBox.Textプロパティはフォーカスを失うとソースを更新しますが、バインディングUpdateSourceTriggerPropertyChanged次のように設定することでこれを変更できます。

{Binding Source={...}, Path=Whatever, UpdateSourceTrigger=PropertyChanged}
于 2010-02-01T21:39:00.190 に答える
1

のアイテムの種類は何ListViewですか?双方向バインディングを実装する必要性を実現するにはINotifyPropertyChanged...

これは、 WPFイベントプロパティの変更に役立つ可能性がありますか?

于 2010-02-01T21:33:05.523 に答える