• windowsphone 中CollectionViewSource和ObservableCollection的使用


    功能描述:一级菜单省份  联动显示省份下的城市 

    直接上代码

    public class City
        {
            public string Num { get; set; }
            public string Name { get; set; }
    
        }
        public class Province
        {
            public string ProvinceName { get; set; }
            public ObservableCollection<City> Citys { get; set; }
        }
        public class ProvinceList : ObservableCollection<Province>
        {
            public ProvinceList()
            {
                ObservableCollection<City> province1 = new ObservableCollection<City>();
                province1.Add(new City { Num = "0374", Name = "郑州" });
                province1.Add(new City { Num = "0377", Name = "南阳" });
                province1.Add(new City { Num = "0373", Name = "新乡" });
    
                ObservableCollection<City> province2 = new ObservableCollection<City>();
    
                province2.Add(new City { Num = "0311", Name = "石家庄" });
                province2.Add(new City { Num = "0312", Name = "保定" });
                province2.Add(new City { Num = "0318", Name = "衡水" });
                province2.Add(new City { Num = "0319", Name = "邢台" });
    
                ObservableCollection<City> province3 = new ObservableCollection<City>()
                {
                    new City(){Num="0731",Name="长沙"},
                    new City(){Num="0733",Name="株洲"}
                };
    
    
                this.Add(new Province() { ProvinceName = "河南省", Citys = province1 });
                this.Add(new Province() { ProvinceName = "河北省", Citys = province2 });
                this.Add(new Province() { ProvinceName = "湖南省", Citys = province3 });
    
    
            }
            protected override void OnPropertyChanged(System.ComponentModel.PropertyChangedEventArgs e)
            {
                base.OnPropertyChanged(e);
            }
            protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
            {
                base.OnCollectionChanged(e);
            }
        }
    View Code

    这是数据源的代码
    主要是省份列表类  继承 ObservableCollection泛型类  这个类有两个两种通知:

    public virtual event NotifyCollectionChangedEventHandler CollectionChanged;  当集合中的某个项更改或者整个集合更改时发生
    protected virtual event PropertyChangedEventHandler PropertyChanged;  当集合中单个项的属性更改时发生

    意思就是当数据源集合改变时或者集合里面的某个属性改变时  进行通知前台显示 

    前台代码:

    <phone:PhoneApplicationPage.Resources>
            <local:ProvinceList x:Key="prolist"/>
            <CollectionViewSource x:Key="ProCityList"
                                  Source="{StaticResource prolist}"/>
            <DataTemplate x:Key="cityList">
                <StackPanel Height="50"
                            Orientation="Horizontal">
    
                    <TextBlock Height="50"
                               Width="100"
                               Text="{Binding Num}"/>
                    <TextBlock Height="50"
                               Width="120"
                               Text="{Binding Name}"/>
                </StackPanel>
            </DataTemplate>
        </phone:PhoneApplicationPage.Resources>
    View Code

    初始化省份列表的数据源,定义显示城市的列表的每一项的数据模板

     注意CollectionViewSource  之所以能分层绑定  多绑定一级  就是因为CollectionViewSource
    MSDN对CollectionViewSource的解释

     CollectionViewSource 允许使用 XAML 代码设置将这些设置传递到基础视图的常用 CollectionView 属性。 CollectionViewSource 具有一个保存实际视图的 View 属性和一个保存源集合的 Source 属性。

    可以将集合视图视为位于绑定源集合之上的一个层,您可以通过它使用排序、筛选和分组查询来导航和显示集合,所有这些操作都无需操作基础源集合本身。 如果源集合实现了INotifyCollectionChanged 接口,则 CollectionChanged 事件引发的更改将传播到视图。

    由于视图不会更改基础源集合,因此每个源集合可以有多个关联的视图。 例如,您可以有一个 Task 对象的集合。 通过使用视图,可以通过多种不同的方式来显示相同数据。 例如,您可能希望在页面左侧显示按优先级排序的任务,而在页面右侧显示按区域分组的任务。

    具体显示的代码:

    <Grid x:Name="ContentPanel" DataContext="{Binding Source={StaticResource ProCityList}}" Grid.Row="1" Margin="12,0,12,0">
                <TextBlock Width="300"
                           Height="50"
                           FontSize="36"
                           Text="请选择省份:"
                           HorizontalAlignment="Left"
                           VerticalAlignment="Top"
                           Margin="10,30,0,0"/>
                <ListBox Name="lb1"
                         Height="141"
                         Width="156"
                         DisplayMemberPath="ProvinceName"
                         ItemsSource="{Binding}"
                         Margin="40,69,260,0"
                         HorizontalAlignment="Center"
                         VerticalAlignment="Top" FontSize="32" />
                <TextBlock Height="62"
                           Width="111"
                           HorizontalAlignment="Left"
                           VerticalAlignment="Top"
                           Text="{Binding Path=ProvinceName}"
                           Foreground="Aqua" Margin="12,210,0,0" FontSize="32" />
    
                <TextBlock Height="50"
                           HorizontalAlignment="Right"
                           Text="城市列表"
                           VerticalAlignment="Top" Margin="0,210,169,0" Width="158" FontSize="32" />
    
                <TextBlock Height="50"
                           Width="120"
                           Text="区号" Margin="6,278,330,279" FontSize="32" />
                <TextBlock Height="50"
                           Width="98"
                           Text="城市名" Margin="0,278,260,279" HorizontalAlignment="Right" FontSize="32" />
    
                <ListBox Name="lb2" 
                         Height="211"
                         VerticalAlignment="Top"
                         ItemsSource="{Binding Path=Citys}"
                         ItemTemplate="{StaticResource cityList}" FontSize="32" Margin="0,328,0,0" />
                <TextBlock Name="tb4" Foreground="White" Text="{Binding Path=Citys.Count}" Width="200" Margin="129,563,127,10"/>
            </Grid>
    View Code

    在这段代码中如果把Grid的DataContent直接写成ObservableCollection泛型集合对象   下面的城市列表绑定就不会显示 

     经过尝试   在wpf中可以这样写<Button Content="{Binding /City/lCity}" />  可以指定下一级的数据绑定  可以一直往下一级绑定  但是windowsphone没有这种写法 所以windowsphone只能绑定到一级  

     

     

     

  • 相关阅读:
    用户反馈
    Alpha版本测试报告
    Alpha Scrum7
    #Alpha Scrum6
    Alpha Scrum5
    #Alpha Scrum4
    Alpha Scrum3
    Alpha Scrum2
    课程总结
    实验九
  • 原文地址:https://www.cnblogs.com/zhan/p/3811500.html
Copyright © 2020-2023  润新知