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); } }
这是数据源的代码
主要是省份列表类 继承 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>
初始化省份列表的数据源,定义显示城市的列表的每一项的数据模板
注意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>
在这段代码中如果把Grid的DataContent直接写成ObservableCollection泛型集合对象 下面的城市列表绑定就不会显示
经过尝试 在wpf中可以这样写<Button Content="{Binding /City/lCity}" /> 可以指定下一级的数据绑定 可以一直往下一级绑定 但是windowsphone没有这种写法 所以windowsphone只能绑定到一级