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 类中:

public Search()
    {
        InitializeComponent();

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

所以我的问题是,数据绑定到底是如何工作的?您可以在 XAML 中看到我尝试绑定变量,但我不知道这是否可行,或者我是否正确执行?

对于初学者,XAML 如何知道在哪里可以找到这些变量?

4

3 回答 3

2

我建议您阅读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"} };

名称在哪里

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

然后在后面的代码中,

myList.ItemsSource = myList; //this lets the XAML from where to fetch the data to bind
于 2012-07-09T10:25:46.383 回答
1

值得注意的是,您当前的代码将不起作用。

每个控件都存在于称为逻辑树的东西中。逻辑树是一个树状的控件层次结构,在此示例中,您的 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}"
于 2012-07-09T10:52:48.967 回答
0

你试过搜索它吗?这有望解释很多数据绑定的工作原理:http: //jesseliberty.com/2010/11/10/windows-phone-from-scratch-6-data-binding-really/

于 2012-07-09T10:17:10.810 回答