3、建立主从视图

对于两个主从关系的ListBox,容易想到的一种方法是将第二个ListBox的数据源绑定为第一个ListBox的SelectedItem,或者通过第一个ListBox的SelectionChanged事件来设置绑定。

但是,若借助于CollectionViewSource类可能会更方便。

CollectionViewSource是一个集合视图类,可以根据不同的筛选、排序条件建立同一个集合对象的多个视图,如同关系数据库中可以根据不同的筛选排序条件建立同一个数据表的多个视图一样。

CollectionViewSource的属性

(1) Source:源集合对象

(2) View:当前视图

(1) 新建一个DepartList类,该类构造函数中会创建一个包含两个部门的部门列表,且各个部门下游若干员工。

C#Code

附带代码:

public class DepartList: ObservableCollection<Department>

{

public DepartList()

{

ObservableCollection<Employee> employee1 = new ObservableCollection<Employee>

{

new Employee{Number=500,Name="张三",Age=40},

new Employee{Number=501,Name="李四",Age=41},

new Employee{Number=502,Name="王五",Age=42}

};

ObservableCollection<Employee> employee2 = new ObservableCollection<Employee>

{

new Employee{Number=503,Name="周武",Age=40},

new Employee{Number=504,Name="郑王",Age=41},

new Employee{Number=505,Name="李代",Age=42}

};

this.Add(new Department { DepName="技术部",employees=employee1});

this.Add(new Department { DepName="商务部",employees=employee2});

}}

(2)在新建XAML页面中添加:xmlns:local="clr-namespace:PhoneApp1"

(3)在新建页面的phone:PhoneApplicationPage.Resources标记下添加一个页面级资源定义。

<phone:PhoneApplicationPage.Resources>

<local:DepartList x:Key="depList"></local:DepartList> <!--DepartList对象的声明式定义-->

<CollectionViewSource x:Key="departView" Source="{StaticResource depList}"></CollectionViewSource> <!--CollectionViewSource对象的定义-->

<DataTemplate x:Key="dtEmployees"> <!--员工列表数据模板的定义-->

<StackPanel Orientation="Horizontal">

<TextBlock Text="{Binding Number}"></TextBlock>

<TextBlock Text="{Binding Name}" ></TextBlock>

<TextBlock Text="{Binding Age}" ></TextBlock>

<TextBlock Text="{Binding BirthYear}" ></TextBlock>

</StackPanel>

</DataTemplate>

</phone:PhoneApplicationPage.Resources>

(3) 在XAML下附带代码如下:

<TextBlock Name="textBlock1" Text="请选择部门:" />

<ListBox DisplayMemberPath="DepName" ItemsSource="{Binding Source={StaticResource departView}}" Name="listBox1" />

<TextBlock Name="textBlock2" Text="{Binding Path=CurrentItem.DepName,Source={StaticResource departView}}" />

<TextBlock Name="textBlock3" Text="员工列表:" />

<StackPanel Orientation="Horizontal">

<TextBlock Name="textBlock5" Text="工号" />

<TextBlock Name="textBlock4" Text="姓名" />

<TextBlock Name="textBlock6" Text="年龄" />

<TextBlock Name="textBlock7" Text="出生年份" />

</StackPanel>

<ListBox ItemsSource="{Binding Source={StaticResource departView},Path=CurrentItem.employees}" ItemTemplate="{StaticResource dtEmployees}" Name="listBox2" />

注意:其中两处的CurrentItem,代表当前绑定源departView的当前选定项。由于CollectionViewSource会自动识别,因此,在实际使用过程中均可省略,即直接写作employees。