2012-07-09 26 views
0

我正在嘗試將數據添加到列表框中。如果你看一下我的XAML,這是我的列表框,我已經構造:數據綁定如何工作?

<ListBox 
      Height="517" 
      HorizontalAlignment="Left" 
      Margin="12,84,0,0" 
      Name="searchList" 
      VerticalAlignment="Top" 
      Width="438" 
      SelectionChanged="SearchList_SelectedEvent"> 

      <!-- What each listbox item will look like --> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Text="{Binding firstName}" FontSize="28" /> 
         <TextBlock Text="{Binding lastName}" FontSize="28" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 

</ListBox> 

而且在我的.css類與包含ListBox中屏幕相關:

public Search() 
    { 
     InitializeComponent(); 

     //The variables that I want to render in the list   
     string firstName = "John"; 
     string lastName = "Smith"; 
    } 

所以我的問題是,數據綁定究竟如何工作?你可以看到在XAML中我試圖綁定這些變量,但是我不知道這是否會起作用,或者我是否正確地做到了這一點?對於初學者來說,XAML如何知道在哪裏找到這些變量?

回答

2

我建議你通過this tutorial由Tomas Jansson建議在另一個答案。 除了你的代碼,

首先你需要創建一個List或ObservableCollection,它包含可綁定到ListBox的數據。

List myList = new List() 
      {new Name() { firstName = "sdfjsdk", lastName= "sdfsfsjdf"}, 
      new Name() { firstName = "bthbbh", lastName= "ereyyyu"}, 
      new Name() { firstName = "svbfbb", lastName= "sdfertbn"} }; 

其中Name是

class Name() 
{ 
    string firstName; 
    string lastName; 
} 

,然後在後面的代碼,

myList.ItemsSource = myList; //this lets the XAML from where to fetch the data to bind 
+0

好吧現在它更清晰了,所以基本上你只需將listBox.ItemsSource()設置爲一些其他對象,然後包含firstName和lastName等。然後listBox會自動填充數據,我不必遍歷一個for循環或類似的東西來填充列表? – Tiwaz89 2012-07-09 10:37:01

+0

是的,你不需要使用任何種類的迭代 – nkchandra 2012-07-09 10:49:57

+0

你有這個教程方便嗎? – 2014-10-27 16:01:45

0

您是否嘗試過搜索它?這有希望解釋了很多如何數據綁定的工作原理:http://jesseliberty.com/2010/11/10/windows-phone-from-scratch-6-data-binding-really/

+1

鏈接只有答案不是很好的答案。除非你要在這裏解釋這個解決方案,並使用鏈接作爲資源 - 這將作爲評論更好。 – ChrisF 2012-07-09 10:21:14

+0

@Tomas Jansson - 感謝托馬斯,儘管如此,它確實讓事情變得更加清晰。 – Tiwaz89 2012-07-09 10:37:42

+0

@ChrisF,我會牢記這一點。 – 2012-07-09 12:25:11

1

值得一提的是當前的代碼將無法正常工作。

每個控件都存在於被稱爲邏輯樹的東西中。邏輯樹是一個類似於控制層次的樹,在這個例子中你的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}" 
+0

*「如果你在ListBox上設置了DataContext,那麼所有的列表框兒童都會看到這個DataContext」*我知道你在那裏想說什麼,但這是錯誤的。列表框的子項將其數據上下文設置爲與列表框的ItemsSource屬性綁定的集合中的單個項目。如果你說「如果你在網格上設置DataContext,網格的所有孩子都會擁有這個DataContext」 – Will 2016-08-01 15:06:14

+1

是的你認爲我只是想解釋數據上下文是如何工作的並且選擇了一個不好的控件示例(例如,除了'ItemsControl'之外的任何東西都會像你所說的那樣更好) – Charleh 2016-08-01 15:50:53