zoukankan      html  css  js  c++  java
  • Windows Phone7 中实现主从视图

    在实际开发中,经常会使用到主从的显示,当选中一个父项,则子项的集合自动进行修改,我们可以使用传统的SelectedIndexChanged修改去实现,但是通常情况下借助于collectionViewSource类更方便的来实现。

    准备工作:

    1.新建实体类

    职工类:

      public class Employee
        {
            public int Number { get; set; }
            public string Name { get; set; }
            public string Sex { get; set; }
            public int BirthYear { get; set; }
        }

     部门类:

        public class Department
        {
            public string DeptName { get; set; }
            public ObservableCollection<Employee> Employees { get; set; }
        }

    自定义集合类(关键):

       public class DepartmentList:ObservableCollection<Department>
        {
            public DepartmentList()
            {
                ObservableCollection<Employee> employees1 = new ObservableCollection<Employee>()
                {
                    new Employee{ Number=2012, Name="MagicBoy", Sex="", BirthYear=2000},
                    new Employee{ Number=1001, Name="ListenFly", Sex="", BirthYear=1990},
                    new Employee{ Number=2555,Name="Tank",  Sex="", BirthYear=1980}
                };
    
                ObservableCollection<Employee> employees2 = new ObservableCollection<Employee>()
                {
                    new Employee{ Number=2012, Name="Harry", Sex="", BirthYear=2000},
                    new Employee{ Number=1001, Name="Fly", Sex="", BirthYear=1990},
                    new Employee{ Number=2555,Name="MayDay",  Sex="", BirthYear=1980}
                };
    
                this.Add (new Department{ DeptName="录音部", Employees=employees1});
                this.Add(new Department { DeptName = "唱片部", Employees = employees2 });
            }
        }

    一共创建了三个类,一个职工类,一个部门类,部门类和职工类是一对多的关系,所以在部门类中有一个职工的集合;最后一个类是自定义集合,顾名思义,实现了ObservableCollection<Deparment>,然后在类中添加了两个Department对象(同时初始化职工类的数据,这样便有了一对多的数据).

    然后看XAML怎么使用:

    首先在phone中引用对当前命名空间的引用,前缀为local,然后声明资源;资源包括一个DepartmentList的对象,一个CollectionViewSource的对象(source属性表明该数据源,在这里赋值为DepartmentList,这样便可以进行主动的实现,后边会讲到),同时为了让ListBox显示更好的效果(多列),在此创建了一个模板,用于显示职工信息。

        <phone:PhoneApplicationPage.Resources>
            <local:DepartmentList x:Key="depList"></local:DepartmentList>
            <CollectionViewSource x:Key="departmentView" Source="{StaticResource depList}"></CollectionViewSource>
            <DataTemplate x:Key="dtEmployees">
                <StackPanel Height="50" HorizontalAlignment="Center" Width="480" 
                            VerticalAlignment="Top" Orientation="Horizontal">
                    <TextBlock Height="50" HorizontalAlignment="Left" Text="{Binding Number}" VerticalAlignment="Top" Width="120"></TextBlock>
                    <TextBlock Height="50" HorizontalAlignment="Left" Text="{Binding Name}" VerticalAlignment="Top" Width="120"></TextBlock>
                    <TextBlock Height="50" HorizontalAlignment="Left" Text="{Binding Sex}" VerticalAlignment="Top" Width="120"></TextBlock>
                    <TextBlock Height="50" HorizontalAlignment="Left" Text="{Binding BirthYear}" VerticalAlignment="Top" Width="120"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </phone:PhoneApplicationPage.Resources>

    看下显示部分的代码:

            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <Grid.RowDefinitions>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                </Grid.RowDefinitions>
                <ListBox x:Name="listDepartment" Grid.Row="0" DisplayMemberPath="DeptName" 
    ItemsSource
    ="{Binding Source={StaticResource departmentView}}"></ListBox> <ListBox x:Name="listEmployees" Grid.Row="1"  VerticalAlignment="Top" Height="400" ItemTemplate="{StaticResource dtEmployees}"
    ItemsSource
    ="{Binding Path=CurrentItem.Employees,Source={StaticResource departmentView}}"> </ListBox> </Grid>

    代码很简单,两个ListBox构成,这个不是重点,重点的属性的设置,可以看到设置listDepartment(部门列表)的DisplayMemberPath为部门名称,同时设置ItemSource为
    很奇怪的表达式ItemsSource="{Binding Source={StaticResource departmentView}}" ,慢慢来分析,Binding不用解释就是绑定,Source为指向一个数据源,这里

    数据源就是在资源中创建的collectionViewSource,由于我们指定了listDepartment的DisplayMemberPath为DepName,所以只会显示部门信息。

    然后来看第二个ListBox,listEmployees先是指定了ItemTemplate,后头去看我们的这个模板,可以看到在模板中使用一个StackPanel横向放了四个TextBlock,同时

    设置Text绑定为一个个属性。我们指定listEmployeest的项模板为资源中创建的,重点不是这个,重点同样为ItemsSource的设置,
    ItemsSource="{Binding Path=CurrentItem.Employees,Source={StaticResource departmentView}}",这个看起来比刚才的还要复杂,没关系,道理是一样的。

    首先我们会发现这个表达式中后半部分和listDeparment是一样的,那就是Source={StaticResource departmentView},说明这两个ListBox的数据源是一致的,重点
    是前边的Path=CurrentItem.Employees,很神奇,这个CurrentItem就是代表当前绑定源departmentView的当前选中项,这个CollectionViewSource会自动识别(其实
    可以省略的),所以CurrentItem.Employees就是当前department对应的Employees.到此Windows Phone中实现简单的主从显示就完成了,附效果图和源码.

     

     源码下载

  • 相关阅读:
    getRandomInt getRandomString
    git 换行符替换
    Versions maven plugin 修改版本
    spotless-maven-plugin java代码自动格式化mvn spotless:apply -fn
    eclipse.ini
    JVM架构和GC垃圾回收机制
    查看搜狗浏览器记住的密码
    TestGc finalize()
    Storm个人学习总结
    mongo嵌套查询
  • 原文地址:https://www.cnblogs.com/ListenFly/p/2547047.html
Copyright © 2011-2022 走看看