Программная привязка List к ListBox - PullRequest
21 голосов
/ 16 января 2009

Допустим, например, у меня есть следующее чрезвычайно простое окно:

<Window x:Class="CalendarGenerator.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="447">
    <Grid>
        <ListBox Margin="12,40,0,12" Name="eventList" HorizontalAlignment="Left" Width="134" />
    </Grid>
</Window>

И простой список, определенный как:

List<String> ListOfNames = new List<String>();

И давайте предположим, что в списке есть несколько имен. Как мне связать List с ListBox, используя как можно больше кода?

Ответы [ 4 ]

38 голосов
/ 16 января 2009

Сначала вам нужно дать вашему ListBox имя, чтобы оно было доступно из вашего кода ( edit . Я заметил, что вы уже сделали это, поэтому я изменю имя моего примера ListBox, чтобы оно отображало ваш):

<ListBox x:Name="eventList" ... />

Тогда это так же просто, как установить свойство ListBox ItemsSource в свой список:

eventList.ItemsSource = ListOfNames;

Поскольку вы определили свой объект "ListOfNames" как List<String>, ListBox не будет автоматически отражать изменения, внесенные в список. Чтобы привязка данных WPF реагировала на изменения в списке, вместо этого определите ее как ObservableCollection <String>.

18 голосов
/ 16 января 2009

Если список данных создается в коде, то вам придется связать его в коде, например так:

eventList.ItemsSource = ListOfNames;

Теперь привязка к списку строк - очень простой пример. Давайте возьмем более сложный.

Скажем, у вас есть класс:

public class Person {
    public string FirstName { get; set; }
    public string Surname { get; set; }
}

Чтобы отобразить список людей, вы можете привязать список к ListBox, но в итоге вы получите список, который отображает «Person» для каждой записи, потому что вы не сказали WPF, как отображать объект person.

Чтобы сообщить WPF, как визуально отображать объекты данных, мы определяем шаблон данных следующим образом:

<Window.Resources>
    <DataTemplate DataType="{x:Type l:Person}">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding FirstName}"/>
            <TextBlock Text=" "/>
            <TextBlock Text="{Binding Surname}"/>
        </StackPanel>
    </DataTemplate>
</Window.Resources>
<Grid>
    <ListBox Name="listBox" />
</Grid>

public Window1() {
    InitializeComponent();
    List<Person> people = new List<Person>();
    people.Add(new Person() { FirstName = "Cameron", Surname = "MacFarland" });
    people.Add(new Person() { FirstName = "Bea", Surname = "Stollnitz" });
    people.Add(new Person() { FirstName = "Jason", Surname = "Miesionczek" });
    listBox.ItemsSource = people;
}

Это будет приятно отображать «Имя, Фамилия» в списке.

Если вы хотите изменить внешний вид, говоря « Фамилия , Имя», все, что вам нужно сделать, это изменить XAML на:

<StackPanel Orientation="Horizontal">
    <TextBlock FontWeight="Bold" Text="{Binding Surname}"/>
    <TextBlock Text=", "/>
    <TextBlock Text="{Binding FirstName}"/>
</StackPanel>
14 голосов
/ 16 января 2009

Используйте Binding класс, если вы хотите настроить привязку:

List<String> listOfNames = new List<String>() {"a", "b"};
Binding myBinding = new Binding();
//set binding parameters if necessary
myBinding.Source = listOfNames;
eventList.SetBinding(ItemsControl.ItemsSourceProperty, myBinding);

или

напрямую назначить данные свойству ItemsSource:

eventList.ItemsSource = listOfNames;
2 голосов
/ 16 января 2009

eventList.ItemsSource = ListOfNames;

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