現在のコードは機能しないことに注意してください。
各コントロールは、論理ツリーと呼ばれるものに存在します。論理ツリーは、この例では ListBox がルートであり、その中のコントロールが子であるコントロールの階層のようなツリーです。
例えば
RootControl
|
|---| ChildOfRootControl
|
|----| ChildOfChildOfRootControl
| |
| | AnotherChildOfChildOfRootControl
|
| AnotherChildOfRootControl
各コントロールには DataContext プロパティがあります。このプロパティは、ツリーをルートからすべての子に自動的に伝達されます (たとえば、任意のコントロールに DataContext を設定すると、コントロールのすべての子にこの DataContext が表示されます。ただし、派生するものは例外です)。ItemsControl
子は通常、バインドされたプロパティの DataContext を持っていますItemsSource
)。この DataContext は、ツリーを下って子コントロールにのみ移動します。新しい値を子コントロールの DataContext に配置すると、親の DataContext がオーバーライドされます。
DataContext は、コントロールがバインドされる既定のオブジェクトです。つまり、バインディングで追加のパラメーターを指定しない場合、DataContext がターゲット オブジェクトになります。
Text="{Binding FirstName}"
上記のバインディングは、DataContext を調べます。他の何かにバインドするには、バインディングなどで Source または ElementName を指定する必要があります
DataContext に加えて、ほとんどのリストのようなコントロールが継承する ItemsControl と呼ばれる基本コントロールがあります。
ItemsControl は、コントロールに表示される項目のリストを指定する ItemsSource というプロパティを公開します。これは、DataContext と ItemsSource の両方を同時に持つことができるという点で、DataContext とは少し異なります。
さらに、ItemsControl 内の子項目 (各リストボックス項目など) は親コントロールから DataContext を継承せず、代わりに DataContext が個別にバインドされている項目を指します。
例 - 'MyObject' の DataContext をルート コントロール (グリッド) に割り当て、'MyListOfObjects' を ListBox に割り当てたとします。
Grid (DataContext = MyObject)
|
|---| ListBox (DataContext = MyObject) (ItemsSource = MyListOfObjects)
|
|----| ListBoxItem (DataContext = MyListOfObjects[0])
| |
| | ListBoxItem (DataContext = MyListOfObjects[1])
| |
| | ListBoxItem (DataContext = MyListOfObjects[2])
| |
| | ListBoxItem (DataContext = MyListOfObjects[3])
|
| TextBox (DataContext = MyObject)
あなたの場合、ListBox.ItemsSource プロパティは NULL になるため、バインディング パスは機能しません。このコードを実行すると、バインディングが存在しないプロパティに評価されるため、出力ウィンドウにバインディング式のエラーが表示される可能性が高くなります (実際、この場合、ItemsSource から作成された項目がないため、表示されません)。
通常、オブジェクト (ビジネス オブジェクトなど) にバインドするか、ページ上の他のコントロールにバインドします。
したがって、あなたの場合、おそらく FirstName および LastName プロパティを格納するオブジェクトを作成する必要があります。また、ListBox を使用しているため、これらの項目のコレクションをバインドする必要があるようです。したがって、理想的には、何らかの変更通知メカニズムを実装するコレクションが必要です。これにより、リストが変更されたときに UI が確実に更新されます。
ObservableCollection はこれを実装しているため、ObservableCollection を作成して ListBox の ItemsSource に割り当てると機能します。
また、ObservableCollection の変更通知はリスト レベルでのみ発生し (リストが変更された場合、たとえばアイテムが追加された場合)、オブジェクト レベルでは発生しないことにも注意してください。リストに含まれるオブジェクトの変更も UI に反映させたい場合は、これらのオブジェクトに変更通知を実装する必要があります。これは、INotifyPropertyChanged インターフェイスを実装することによって行われます。
最後に、バインディングを編集できるようにする場合は、バインディングでこれを指定してください。Silverlight はデフォルトで、すべてのバインディングが読み取り専用であると想定します。Windows Phone 7 が何をするのかはわかりませんが、バインディングでModeを指定する必要があるかもしれません
例えば
Text="{Binding SomeText, Mode=TwoWay}"