C#学习记录(九)Windows Phone开发中的Binding
windows phone中的Binding为数据的显示提供了一个高效便捷的方法。它在xaml和规范化的数据之间架起了直接的渠道,免去了编写遍历数据的代码再规范化显示出来的繁琐编程。
Binding首先需要在xaml的开头注明将要绑定的数据上下文
<Page
...
DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"
d:DataContext="{Binding Source={d:DesignData Source=/DataModel/SampleData.json, Type=data:SampleDataSource}}"
>
其中d:代表用于编写过程中实时绑定的数据,我在编程的过程中一般不写
绑定的上下文我已知的有两种类型,一种是ObservableCollection<> 它类似于IEnumable<>或是List<> , 是一个存储数据的容器。如果使用这种类型进行Binding,xaml中接下来会这样写
<ListView x:Name="myListView" ItemsSource="{Binding}"> <ListView.ItemTemplate> <DataTemplate x:Name="dataTemplate"> <StackPanel Orientation="Horizontal"> <StackPanel Orientation="Vertical" Margin="0,0,20,0"> <TextBlock Text="{Binding Make}" FontSize="24" /> <TextBlock Text="{Binding Model}" FontSize="24" /> </StackPanel> <Button Content="Check In" Width="120" Height="50" Margin="0,0,20,0" Command="{Binding CheckedInCommand}" CommandParameter="{Binding}" /> <TextBlock Text="{Binding CheckedInDateTime}" FontSize="24" /> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView>
注意代码中的几个Binding,可以知道内层Binding是在外层的基础上推进下去的
另一种类型是Dictionary<string, object>,这种类型由于教学视频中的示例个人感觉过于麻烦,导致我研究了好久才弄懂。这是它的代码
<HubSection x:Uid="HubSection2" Header="RECIPES" Width="Auto" DataContext="{Binding Groups[0]}" HeaderTemplate="{ThemeResource HubSectionHeaderTemplate}"> <DataTemplate> <GridView Margin="0,9.5,0,0" ItemsSource="{Binding Items}" AutomationProperties.AutomationId="ItemGridView" AutomationProperties.Name="Items In Group" ItemTemplate="{StaticResource Standard200x180TileItemTemplate}" SelectionMode="None" IsItemClickEnabled="True" ItemClick="ItemView_ItemClick" ContinuumNavigationTransitionInfo.ExitElementContainer="True"> <GridView.ItemsPanel> <ItemsPanelTemplate> <ItemsWrapGrid /> </ItemsPanelTemplate> </GridView.ItemsPanel> </GridView> </DataTemplate> </HubSection>
值得注意的是代码中的Binding Groups[0],这和上一个类型的代码有明显不同。因为Dictionary<string, object>是一个string和object的键值对,在相应的cs代码中有这么一句
this.DefaultViewModel["Groups"] = sampleDataGroups;
这说明Binding的上下文通过"Group"和一个<ObservableCollection<SampleDataGroup>类型的对象对应,而Group[0]代表相应对象中的第一个SampleDataGroup,这其实也是一个ObservableCollection<>类型的容器。接下来的Binding就和之前的一样了。
Binding对于同一种格式的数据,只需要在xaml定义一个template,就可以将所有数据展示出来,是windows phone编程的一个重要知识点。