第十九章:集合视图(二十)

简介:

条件部分
TableView可以有多个部分,如果当前不适用,您可能希望部分完全不可见。 在前面的示例中,标题为“Programmer Information”的第二部分可能包含Language和Platform属性的两个PickerCell元素。 要使该部分可见或隐藏,可以根据IsProgrammer属性的设置将该部分添加到TableRoot中或从TableRoot中删除。 (回想一下,TableView中的内部集合属于ObservableCollection类型,因此TableView应该响应从这些集合中动态添加或删除的项。)不幸的是,这不能完全在XAML中处理,但代码支持相当容易。
这是ConditionalSection程序中的XAML文件。 它与前一个程序中的XAML文件相同,只是不再在TableView上设置BindingContext(在代码隐藏文件中发生),最后两个PickerCell元素已被移动到第二个部分,标题为“ 程序员信息“:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:ConditionalSection"
             xmlns:toolkit=
                "clr-namespace:Xamarin.FormsBook.Toolkit;assembly=Xamarin.FormsBook.Toolkit"
             x:Class="ConditionalSection.ConditionalSectionPage">
    <ContentPage.Padding>
        <OnPlatform x:TypeArguments="Thickness"
                    iOS="0, 20, 0, 0" />
    </ContentPage.Padding>
    <StackLayout>
        <TableView x:Name="tableView"
                   Intent="Form">
            <TableRoot Title="Data Form">
                <TableSection Title="Personal Information">
                    <EntryCell Label="Name:"
                               Text="{Binding Name}"
                               Placeholder="Enter name"
                               Keyboard="Text" />
                    <EntryCell Label="Email:"
                               Text="{Binding EmailAddress}"
                               Placeholder="Enter email address"
                               Keyboard="Email" />
                    <EntryCell Label="Phone:"
                               Text="{Binding PhoneNumber}"
                               Placeholder="Enter phone number"
                               Keyboard="Telephone" />
                    <toolkit:PickerCell Label="Age Range:"
                                        Title="Age Range"
                                        SelectedValue="{Binding AgeRange}">
                        <x:String>10 - 19</x:String>
                        <x:String>20 - 29</x:String>
                        <x:String>30 - 39</x:String>
                        <x:String>40 - 49</x:String>
                        <x:String>50 - 59</x:String>
                        <x:String>60 - 99</x:String>
                    </toolkit:PickerCell>
                    <SwitchCell x:Name="isProgrammerSwitch"
                                Text="Are you a programmer?"
                                On="{Binding IsProgrammer}" />
                </TableSection>
 
                <TableSection x:Name="programmerInfoSection"
                              Title="Programmer Information">
                    <toolkit:PickerCell Label="Language:" 
                                        Title="Language"
                                        SelectedValue="{Binding Language}">
                        <x:String>C</x:String>
                        <x:String>C++</x:String>
                        <x:String>C#</x:String>
                        <x:String>Objective C</x:String>
                        <x:String>Java</x:String>
                        <x:String>Other</x:String>
                    </toolkit:PickerCell>
                    <toolkit:PickerCell Label="Platform:"
                                        Title="Platform"
                                        SelectedValue="{Binding Platform}">
                         <x:String>iPhone</x:String>
                         <x:String>Android</x:String>
                         <x:String>Windows Phone</x:String>
                         <x:String>Other</x:String>
                    </toolkit:PickerCell>
                </TableSection>
            </TableRoot>
        </TableView>
    </StackLayout>
</ContentPage>

代码隐藏文件中的构造函数处理其余部分。 它创建ProgrammerInformation对象以设置为TableView的BindingContext,然后从TableRoot中删除第二个TableSection。 然后,页面构造函数为ProgrammerInformation的PropertyChanged事件设置处理程序,并等待对IsProgrammer属性的更改:

public partial class ConditionalSectionPage : ContentPage
{
    public ConditionalSectionPage()
    {
        InitializeComponent();
        // Set BindingContext of TableView.
        ProgrammerInformation programmerInfo = new ProgrammerInformation();
        tableView.BindingContext = programmerInfo;
        // Remove programmer-information section!
        tableView.Root.Remove(programmerInfoSection);
        // Watch for changes in IsProgrammer property in ProgrammerInformation.
        programmerInfo.PropertyChanged += (sender, args) =>
        {
            if (args.PropertyName == "IsProgrammer")
            {
                if (programmerInfo.IsProgrammer &&
                    tableView.Root.IndexOf(programmerInfoSection) == -1)
                {
                   tableView.Root.Add(programmerInfoSection);
                }
                if (!programmerInfo.IsProgrammer &&
                    tableView.Root.IndexOf(programmerInfoSection) != -1)
                {
                    tableView.Root.Remove(programmerInfoSection);
                }
            }
        };
    }
}

理论上,PropertyChanged处理程序在添加之前不需要检查TableSection是否已经是TableRoot集合的一部分,或者在尝试删除它之前检查它是否不是集合的一部分,但是检查不会受到影响。
这是程序首次启动时只有一个部分可见:
201811102246210429
切换SwitchCell会使另外两个属性进入视图:
201811102247360430
但不是在Windows 10 Mobile屏幕上。
您不需要为整个TableView使用单个BindingContext。 每个TableSection都有自己的BindingContext,这意味着您可以将ViewModel划分为与TableView布局更紧密地协调。

目录
相关文章
|
7天前
|
自然语言处理 开发者 iOS开发
📢通义千问Qwen3大模型新成员:Embedding系列模型登场!可在阿里云百炼直接体验
通义实验室正式发布Qwen3-Embedding系列模型,专为文本表征、检索与排序任务设计。该系列基于Qwen3基础模型训练,支持多语言和代码检索,具备卓越的泛化性、灵活的架构以及全面的语言支持。模型提供0.6B到8B参数规模选择,支持表征维度自定义和指令适配优化。训练采用三阶段架构,结合对比学习与监督训练,提升性能与效率。目前,Qwen3-Embedding已在Hugging Face、ModelScope和GitHub开源,并可通过阿里云百炼平台使用相关服务。未来将持续优化并拓展多模态语义理解能力。
📢通义千问Qwen3大模型新成员:Embedding系列模型登场!可在阿里云百炼直接体验
|
3天前
|
云安全 人工智能 安全
|
4天前
|
数据采集 自然语言处理 搜索推荐
基于Qwen3的Embedding和Rerank模型系列,开源!
近年来,随着大规模预训练语言模型(LLM)的飞速发展,文本嵌入(Embedding)和重排序(Reranking)技术在搜索引擎、问答系统、推荐系统等多个领域的重要性愈发凸显。
571 19
|
3天前
|
人工智能 前端开发 Devops
通义灵码带你玩转开发者常用的MCP(合辑,持续更新中)
今天我们精选了与开发者息息相关和比较热门的MCP 服务,总结了这些技术服务在实际开发的最佳实践,涵盖了从前端开发、后端开发、DevOps、测试、运维等关键环节,及非研发领域中的热度较高的MCP服务。我们通过直播、图文等形式带你了解和学习!
561 3
|
3天前
|
安全 JavaScript 前端开发
Typora免费下载,不需要激活,Typora早期版本,Markdown编辑器
Typora是一款支持实时预览的Markdown编辑器,跨平台兼容Windows、macOS和Linux,适合写作、笔记和技术文档。本文提供合法安全的Typora早期免费版安装方案及常见问题解决方法,助你快速上手。同时详细介绍了Markdown基础用法,包括标题、加粗、斜体、列表、链接、图片、引用、代码块和表格等常用语法,帮助用户高效编写结构化内容。
774 13
|
7天前
|
人工智能 安全 测试技术
信条:阿里云AI攻防安全启示录
解读AI时代下的安全攻防新态势
1107 11
|
5天前
|
存储 前端开发 JavaScript
2025 最新前端 100 道经典面试题及详细答案汇总整理
本文整理了100道前端常见面试题及其详细答案,涵盖HTML、CSS、JavaScript等多个领域,助你系统复习前端知识。内容包括HTML5新特性、CSS盒模型、Flex与Grid布局区别、选择器优先级等核心知识点,以及伪类和伪元素的区别等细节。适合准备面试或巩固基础的开发者学习。资源可从文末链接下载。
431 0
|
14天前
|
人工智能 API 开发者
一文带你 "看见" MCP 的过程,彻底理解 MCP 的概念
本文介绍了模型上下文协议(MCP)的基本概念、工作原理及其应用过程。MCP 是一种连接 AI 助手与数据系统的开放标准,旨在帮助大模型生成更高质量的响应。文章从 RAG 和 Function Calling 的理论基础出发,详细解析了 MCP 的核心组件(主机、客户端、服务器)及优势,并通过 ModelScope 和 Cherry Studio 实例展示其操作流程。同时,文中指出了 MCP 存在的手动配置复杂、工具稳定性不足等问题,但也强调其作为过渡协议的重要性,为未来智能体间的协同和工具使用提供了方向。
1437 55
一文带你 "看见" MCP 的过程,彻底理解 MCP 的概念
|
7天前
|
人工智能 Java 决策智能
Spring AI Alibaba Graph:多智能体框架实践
Spring AI Alibaba 是一个面向 Java 开发者的开源人工智能框架,旨在简化 AI 应用开发。本文重点介绍其 Graph 组件,用于解决工作流与多智能体协作问题。Graph 组件通过声明式编程接口,提供统一的上下文管理、消息记忆、人工确认节点等功能,支持复杂 AI 应用的构建。
|
9天前
|
人工智能 IDE 开发工具