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编程的一个重要知识点。

posted on 2015-05-04 21:35  Zany丶  阅读(227)  评论(0编辑  收藏  举报

导航