以编程方式将List绑定到ListBox

时间:2009-01-16 03:31:20

标签: c# wpf data-binding

让我们说比如我有以下非常简单的窗口:

<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 个答案:

答案 0 :(得分:38)

首先,您需要为ListBox命名,以便可以从后面的代码中访问它(编辑我注意到您已经完成了此操作,因此我将示例ListBox的名称更改为反映你的):

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

然后就像将ListBox的ItemsSource属性设置为列表一样简单:

eventList.ItemsSource = ListOfNames;

由于您已将“ListOfNames”对象定义为List<String>,因此ListBox不会自动反映对列表所做的更改。要让WPF的数据绑定对列表中的更改做出反应,请将其定义为ObservableCollection <String>

答案 1 :(得分:18)

如果数据列表是在代码中创建的,那么您将不得不在代码中绑定它,如下所示:

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

这将在列表中很好地显示“Firstname Surname”。

如果您想将外观更改为“姓氏,名字”,您只需将XAML更改为:

<StackPanel Orientation="Horizontal">
    <TextBlock FontWeight="Bold" Text="{Binding Surname}"/>
    <TextBlock Text=", "/>
    <TextBlock Text="{Binding FirstName}"/>
</StackPanel>

答案 2 :(得分:14)

如果要自定义绑定,请使用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;

答案 3 :(得分:2)

eventList.ItemsSource = ListOfNames;