Программная привязка List к 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, используя как можно больше кода?
4 ответа
Сначала вам нужно дать вашему ListBox имя, чтобы оно было доступно из вашего кода (отредактируйте, я отмечаю, что вы уже сделали это, поэтому я изменю имя моего примера ListBox, чтобы оно соответствовало вашему):
<ListBox x:Name="eventList" ... />
Тогда это так же просто, как установить свойство ListSox ItemsSource для вашего списка:
eventList.ItemsSource = ListOfNames;
Поскольку вы определили свой объект "ListOfNames" как List<String>
ListBox не будет автоматически отражать изменения, внесенные в список. Чтобы привязка данных WPF реагировала на изменения в списке, определите ее как ObservableCollection<String>
вместо.
Если список данных создается в коде, то вам придется связать его в коде, например так:
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>
Используйте класс 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;