我想知道如何以动态方式填充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或者...
谢谢
[编辑:在我需要的地方添加名称属性]
答案 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"));
}
}
编辑:根据评论中的讨论,也许你只需要一个简单的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
内呈现该内容。