填充ListBoxItem内容

时间:2011-03-31 10:38:51

标签: windows-phone-7 listbox

我想知道如何以动态方式填充ListBox。但我不想要一个自定义类,我只想要一个普通的选择器。

我通常用自己的课做这样的事情:

<ListBox Name="itemList" SelectionChanged="itemList_SelectionChanged">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <TextBlock Text="{Binding title}"/>
                <TextBlock Text="{Binding subtitle}"  />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我不知道的是如何简单地生成最简单的东西:像这样:

<ListBox>
    <ListBoxItem Name="item1" Content="First item" />
    <ListBoxItem Name="item2" Content="Second item" />
    <ListBoxItem Name="item3" Content="Third item" />
</ListBox>

你能举一个结构的例子吗?我不知道我是否必须使用datatemplate或者...

谢谢

[编辑:在我需要的地方添加名称属性]

2 个答案:

答案 0 :(得分:2)

您只需在DataContext中设置包含项目的Collection,并将其设置为ListBox.ItemsSource。然后,这将填写您的DataTemplate。

参见例如:

<Grid>
    <Grid.Resources>
        <src:Customers x:Key="customers"/>
    </Grid.Resources>
    <ListBox ItemsSource="{StaticResource customers}" Width="250" Margin="0,5,0,10" 
       DisplayMemberPath="LastName"/>
</Grid>

public class Customer
{
    public String FirstName { get; set; }
    public String LastName { get; set; }
    public String Address { get; set; }

    public Customer(String firstName, String lastName, String address)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
        this.Address = address;
    }

}

public class Customers : ObservableCollection<Customer>
{
    public Customers()
    {
        Add(new Customer("Michael", "Anderberg",
                "12 North Third Street, Apartment 45"));
        Add(new Customer("Chris", "Ashton",
                "34 West Fifth Street, Apartment 67"));
        Add(new Customer("Cassie", "Hicks",
                "56 East Seventh Street, Apartment 89"));
        Add(new Customer("Guido", "Pica",
                "78 South Ninth Street, Apartment 10"));
    }

}

示例来源:http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemssource(v=vs.95).aspx

编辑:根据评论中的讨论,也许你只需要一个简单的ItemsControl(因为你不需要保留所选的项目,甚至更好地处理多个选择,这就是ListBox的用途)。 / p>

例如:

<ItemsControl ItemsSource="{Binding NavigateItems}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding Label}"
                    Command="{Binding ButtonCommand}"                                                               
                    CommandParameter="{Binding URL}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

public class NavigateItem
 {
     public String Label { get; set; }
     public String URL { get; set; }

     public NavigateItem(String label, String url)
     {
         this.Label = label;
         this.URL = url;
     }

 }

public class NavigateItems : ObservableCollection<NavigateItem>
{
    public NavigateItems()
    {
        Add(new NavigateItem("Google", "http://www.google.com");
        Add(new NavigateItem("Bing", "http://www.bing.com");
    }
}

当然,设置ButtonCommand以导航到参数中传递的URL,但这取决于你如何设置ViewModel / bindings。

答案 1 :(得分:1)

如果您没有或不想要自定义类,即如果您只有一个字符串集合,则可以将该字符串集合(List,IEnumerable,string []等)指定为 ItemsSource 代码隐藏中的ListBox(或从XAML绑定),它将使用TextBlock在每个ListBoxItem内呈现该内容。