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

  • 相关阅读:
    angular4升级angular5问题记录之this.location.back()
    angular4升级angular5问题记录之No NgModule metadata found for 'AppModule'
    Angular4图片上传预览路径不安全问题
    Angular4.0引入laydate.js日期插件方法
    Angular4.0用命令行创建组件服务出错
    IE10以下的img标签问题
    关于for循环删除数组内容出现的问题
    关于onmouseover和onmouseout的bug
    纯lua实现Base64加密与解密
    SciTE如何修改背景色
  • 原文地址:https://www.cnblogs.com/zany/p/4477603.html
Copyright © 2020-2023  润新知