Подтвердить что ты не робот

Программный привязку List to ListBox

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

<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, используя как можно больше кода?

4b9b3361

Ответ 1

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

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

Затем это так же просто, как установка свойства ListBox ItemsSource в ваш список:

eventList.ItemsSource = ListOfNames;

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

Ответ 2

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

eventList.ItemsSource = ListOfNames;

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

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

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

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

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

<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>

Ответ 3

Используйте 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;

Ответ 4

eventList.ItemsSource = ListOfNames;