DataContext

簡単なサンプルでBinding時に対象となるCustomerクラスのプロパティしか指定していないのに、データが表示されるのは、
Bindingオブジェクトが、DataContextが設定されている親オブジェクトを上階層に探す為です。言葉で説明するが下手なので、以下のようなプログラムで、試してみます。

Binding時にSourceを指定する事により、明示的に設定する事も可能です。

画面レイアウト bookmark

画面レイアウト

上記画面レイアウトのXAMLは、以下のようになっています。

親子関係を作る為、グリッドを入れ子にしています。また、各グリッドには名前を設定します。
・Window > Grid(grdMain) > Grid(grdFirstName?) > TextBox?(txtFirstName?)
・Window > Grid(grdMain) > Grid(grdLastName?) > TextBox?(txtLastName?)
このような関係が成り立ちます。

DataContextを設定してみる bookmark

LoadedイベントでDataContextを設定するオブジェクトを変化させて、どのようにBindingされるか見てみましょう。
Window.DataContextには、簡単なサンプル?で設定して動作確認しているので、まずは、Grid(grdMain)に設定してみます。

この場合、TextBox?(txtFirstName?)から上階層にDataContextを探すので、
TextBox?(txtFirstName?)->Grid(grdFirstName?)->Grid(grdMain)
というように、Grid(grdMain)のDataContextを利用します。TextBox?(txtLastName?)も同様ですね。

次に、Grid(grdFirstName?)に設定してみます。

この場合も同様に、
TextBox?(txtFirstName?)->Grid(grdFirstName?)
というように、Grid(grdFirstName?)のDataContextを利用します。しかし、TextBox?(txtLastName?)はどうでしょうか?
TextBox?(txtLastName?)->Grid(grdLastName?)->Grid(grdMain)->Window
DataContextを探しますが、DataContextが存在しない為、TextBox?(txtLastName?)には何も表示されません。
では、以下のコードではどうでしょうか?

サンプル実行画面

txtFirstName?、txtLastName?には、それぞれ親に指定したDetaContext?の内容が表示されるのが確認できます。
このように、DataContextが設定されている親オブジェクトを上階層に探すことが確認できました。

コメント bookmark

  • 下から2行目のところのDataContextDetaContext?になってます。 -- hirotow? 2007-09-26 (水) 11:23:09
  • YkRdcChTkOfKLhYNDba -- xrwiztj? 2009-11-04 (水) 13:54:41