传统的ListBox只能将条目以字符串的形式显示,而WPF中的ListBox除了可以显示中规中矩的字符串条目外还能够显示更多的元素,如CheckBox、RadioButton、TextBox等。
<Window x:Class="Chapter5.Page54.ListBox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<ListBox Margin="5">
<CheckBox x:Name="checkBoxTim" Content="Tim"/>
<CheckBox x:Name="checkBoxTom" Content="Tom"/>
<CheckBox x:Name="checkBoxBruce" Content="Bruce"/>
<Button x:Name="buttonMess" Content="Mess" Click="buttonMess_Click" />
<Button x:Name="buttonOwen" Content="Owen"/>
<Button x:Name="buttonVictor" Content="Victor" Click="buttonVictor_Click"/>
</ListBox>
</StackPanel>
</Window>
private void buttonVictor_Click(object sender, RoutedEventArgs e)
{
Button btn = sender as Button;
MessageBox.Show(btn.GetType().ToString());
DependencyObject level1 = VisualTreeHelper.GetParent(btn);
MessageBox.Show(level1.GetType().ToString());
DependencyObject level2 = VisualTreeHelper.GetParent(level1);
MessageBox.Show(level2.GetType().ToString());
DependencyObject level3 = VisualTreeHelper.GetParent(level2);
MessageBox.Show(level3.GetType().ToString());
}
WPF的UI是树形结构,VisualTreeHelper类就是帮助我们在这棵由可视化元素构成的树上进行导航的辅助类。我们沿着被单击的Button一层层的向上找,找到第三层发现它是一个ListBoxItem。ListBoxItem就是ListBox对应的ItemContainer,也就是说,无论你把什么样的数据集合交给ListBox,它都会以这种方式进行自动包装。
大多数情况下,UI上的列表会用于显示动态的后台数据,这时候我们就可以交给ItemsControl的就是程序逻辑中的数据而非控件了。
假设程序中定义有Employee类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Chapter5.Page54.ListBox
{
public class Employee
{
public int Id { set; get; }
public string Name { set; get; }
public int Age { set; get; }
}
}
并且我们在XAML后台里定义一个Employee类的集合:
List<Employee> empList1 = new List<Employee>()
{
new Employee(){Id=1,Name="Tim",Age=30},
new Employee(){Id=2,Name="T2m",Age=20},
new Employee(){Id=3,Name="T3m",Age=30},
new Employee(){Id=4,Name="T4m",Age=40},
};
在主程序界面上添加一个ListBox控件empList后,在后台代码里给这个ListBox添加数据源等属性:
this.empList.DisplayMemberPath = "Name";
this.empList.SelectedValuePath = "Id";
this.empList.ItemsSource = empList1;
DisplayMemberPath属性告诉ListBox显示每条数据的哪个属性,换句话说,ListBox会去调用这个属性值的ToString()方法,把得到的字符串放入一个TextBlock(最简单的文本控件),然后再按照前面说的办法把TextBlock包装进一个ListBoxItem中。
ListBox的SelectValuePath属性将与其SelectedValue属性配合使用。当调用SelectedValue属性时,ListBox先找到选中的Item所对应的数据对象,然后把SelectedValuePath的值当做数据对象的属性名称并把这个属性值取出来。
private void buttonMess_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(this.empList.SelectedValue.ToString());
}
DisplayMemberPath和SelectedValuePath是两个相当简化的属性。DisplayMemberPath只能显示简单的字符串,想用更加复杂的 形式显示数据需要使用 DataTemplate。
SelectValuePath也只能返回单一的值,如果想进行一些复杂的操作,不妨直接使用ListBox的SelectedItem和SelectedItems属性,这两个属性返回的就是数据集合中的对象
private void buttonMess_Click(object sender, RoutedEventArgs e)
{
Employee em = this.empList.SelectedItem as Employee;
MessageBox.Show(em.Name);
}
源代码: http://download.youkuaiyun.com/detail/eric_k1m/6570437