2012-07-09 28 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