值得一提的是當前的代碼將無法正常工作。
每個控件都存在於被稱爲邏輯樹的東西中。邏輯樹是一個類似於控制層次的樹,在這個例子中你的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