首页 > 代码库 > windowsphone 中CollectionViewSource和ObservableCollection的使用

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