Заполнить ListBoxItem Содержимое - PullRequest
0 голосов
/ 31 марта 2011

Я хотел знать, как я могу динамически заполнить 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>

Не могли бы вы привести пример структуры? Я не знаю, должен ли я использовать табличку с данными или что ...

Спасибо

[Отредактировано: добавлено свойство Name в том, что мне нужно]

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Вам просто нужно настроить коллекцию с вашими элементами в вашем DataContext и установить ее как 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).

Например:

<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 / привязок.

1 голос
/ 31 марта 2011

Если у вас нет или вам нужен пользовательский класс, т. Е. Если у вас есть просто коллекция строк, вы можете назначить эту коллекцию строк (List, IEnumerable, string [] и т. Д.) Как ItemsSource для ListBox в вашем коде (или связать его из XAML), и он будет использовать TextBlock для рендеринга этого контента в каждом ListBoxItem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...