值得一提的是当前的代码将无法正常工作。
每个控件都存在于被称为逻辑树的东西中。逻辑树是一个类似于控制层次的树,在这个例子中你的ListBox是根,而其中的控件是子控件。
例如
RootControl
|
|---| ChildOfRootControl
|
|----| ChildOfChildOfRootControl
| |
| | AnotherChildOfChildOfRootControl
|
| AnotherChildOfRootControl
每个控件都有一个DataContext属性 - 这个属性是从根树自动传播到所有的孩子(例如,如果你设置的DataContext上的任何控制所有控制的孩子会看到这样的DataContext - 这是除了源自ItemsControl
的任何内容,其中儿童通常具有绑定的ItemsSource
财产的DataContext)。这个DataContext只会沿着树向下到子节点 - 如果你在子控件的DataContext中放置一个新的值,它将覆盖父节点DataContext DataContext是你的控件将绑定到的默认对象:ie if你不指定在你的绑定任何额外的参数,在DataContext将目标对象
Text="{Binding FirstName}"
在DataContext的上述结合的外观。为了绑定到别的东西,你需要在绑定中指定Source或ElementName。
除了DataContext之外,还有一个名为ItemsControl的基本控件,其中大多数类列表控件都将继承它。
ItemsControl公开了一个名为ItemsSource的属性,它指定了将出现在控件中的项目列表。这与DataContext稍有不同,因为您可以同时拥有DataContext和ItemsSource。
此外,ItemsControl中的任何子项(例如每个列表框项)都不会从其父控件继承DataContext,而是它们的DataContext将指向它们单独绑定到的项。
示例 - 假设你分配“为MyObject”的一个DataContext到根控制(网格),并分配“MyListOfObjects”到列表框:
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上的更改通知只发生在列表级别 - (如果列表已更改,例如添加了一个项目),但不会在对象级别发生。如果您还希望对包含在列表中的对象进行更改以反映在用户界面中,则需要对这些对象实施更改通知。这是通过实现INotifyPropertyChanged接口完成的。
最后 - 如果您希望能够编辑绑定,请确保您在绑定中指定了这一点 - 默认情况下,Silverlight假定所有绑定都是只读的。我不确定Windows Phone 7的功能,但可能需要在您的绑定中指定模式
例如,
Text="{Binding SomeText, Mode=TwoWay}"
好吧现在它更清晰了,所以基本上你只需将listBox.ItemsSource()设置为一些其他对象,然后包含firstName和lastName等。然后listBox会自动填充数据,我不必遍历一个for循环或类似的东西来填充列表? – Tiwaz89 2012-07-09 10:37:01
是的,你不需要使用任何种类的迭代 – nkchandra 2012-07-09 10:49:57
你有这个教程方便吗? – 2014-10-27 16:01:45