让我们说比如我有以下非常简单的窗口:
<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?
答案 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;