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只能绑定到一级  

 

 

 

 

 

posted on 2014-06-27 10:53    阅读(627)  评论(0编辑  收藏  举报

导航