值得注意的是,您当前的代码将不起作用。
每个控件都存在于称为逻辑树的东西中。逻辑树是一个树状的控件层次结构,在此示例中,您的 ListBox 是根,其中的控件是子控件。
例如
RootControl
|
|---| ChildOfRootControl
|
|----| ChildOfChildOfRootControl
| |
| | AnotherChildOfChildOfRootControl
|
| AnotherChildOfRootControl
每个控件都有一个 DataContext 属性 - 此属性会自动从根向下传播到所有子控件(例如,如果您在任何控件上设置 DataContext,则所有控件的子控件都会看到此 DataContext - 除了任何派生的ItemsControl
其中孩子通常具有绑定ItemsSource
属性的 DataContext )。此 DataContext 仅沿树向下传递到子控件 - 如果您将新值放入子控件的 DataContext 中,它将覆盖父 DataContext
DataContext 是您的控件将绑定到的默认对象:即,如果您未在绑定中指定任何其他参数,则 DataContext 将是目标对象
Text="{Binding FirstName}"
上面的绑定着眼于 DataContext。为了绑定到其他东西,您需要在绑定等中指定 Source 或 ElementName
除了 DataContext 之外,还有一个名为 ItemsControl 的基本控件,大多数类似列表的控件都将从该控件继承。
ItemsControl 公开了一个名为 ItemsSource 的属性,该属性指定将出现在控件中的项目列表。这与 DataContext 有点不同,因为您可以同时拥有 DataContext 和 ItemsSource。
此外,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 应该可以工作。
It might also be worth noting that change notification on ObservableCollection only happens at the list level - (if the list is changed, an item added for instance) but does not happen at the object level. If you also want changes on the objects contained in the list to reflect in the UI then you need to implement change notification on these objects. This is done by implementing the INotifyPropertyChanged interface.
Finally - if you want to be able to edit a binding, make sure you specify this in the binding - Silverlight by default assumes all bindings are read-only. I'm not sure what Windows Phone 7 does, but it may be that you need to specify Mode in your bindings
e.g.
Text="{Binding SomeText, Mode=TwoWay}"