活动介绍

深入探究数据绑定:从基础到服务构建

立即解锁
发布时间: 2025-08-14 00:59:01 阅读量: 10 订阅数: 28
PDF

Silverlight 3开发实战指南

### 深入探索Silverlight数据绑定:从基础到高级应用 #### 1. 数据对象存储为资源 在Silverlight开发中,通常会将所有绑定控件放置在同一个容器中,这样只需为容器设置一次`DataContext`,而不必为每个绑定元素单独设置。除了这种方式,还可以将数据对象定义为XAML标记中的资源,然后通过添加`Source`属性来修改每个绑定表达式。 以下是创建`Product`对象作为资源的示例代码: ```xml <UserControl.Resources> <local:Product x:Key="resourceProduct" ModelNumber="AEFS100" ModelName="Portable Defibrillator" UnitCost="77" Description="Analyzes the electrical activity of a person's heart and applies an electric shock if necessary."> </local:Product> </UserControl.Resources> ``` 此标记假设已将项目命名空间映射到XML命名空间前缀`local`。例如,如果项目名为`DataBinding`,则需要在`UserControl`开始标记中添加以下属性: ```xml xmlns:local="clr-namespace:DataBinding" ``` 要在绑定表达式中使用此对象,需要指定`Source`属性。可以使用`StaticResource`表达式来设置`Source`属性,该表达式使用资源的键名: ```xml <TextBox Text="{Binding ModelNumber, Source={StaticResource resourceProduct} }"> </TextBox> ``` 不过,在每个数据绑定表达式中都必须指定`Source`属性。如果需要将大量元素绑定到同一个数据对象,设置容器的`DataContext`属性会更简单。在这种情况下,仍然可以使用`StaticResource`来设置`DataContext`属性,从而将一组嵌套元素绑定到定义为资源的单个数据对象: ```xml <Grid Name="gridProductDetails" DataContext="{StaticResource resourceProduct}"> ``` 需要注意的是,将数据对象定义为资源会牺牲一定的灵活性。虽然仍然可以更改该对象,但无法替换它。如果计划从其他源(如Web服务)检索数据对象的详细信息,在代码中创建数据对象会更自然。 此外,`Binding`标记扩展除了`Source`属性外,还支持其他几个属性,包括`Mode`(允许使用双向绑定来编辑数据对象)和`Converter`(允许在显示源值之前对其进行修改)。 #### 2. 双向绑定编辑 当用户更改文本控件中显示的绑定值时,可能会想知道内存中的`Product`对象是否会发生变化。可以使用以下代码从`DataContext`中获取当前的`Product`对象,并将其属性显示在`TextBlock`中: ```csharp Product product = (Product)gridProductDetails.DataContext; lblCheck.Text = "Model Name: " + product.ModelName + "\nModel Number: " + product.ModelNumber + "\nUnit Cost: " + product.UnitCost; ``` 运行此代码会发现,更改显示的值不会产生任何影响,`Product`对象仍保持其原始形式。这是因为绑定表达式默认使用单向绑定。 实际上,Silverlight允许在设置`Binding.Mode`属性时使用`System.Windows.Data.BindingMode`枚举中的三个值之一,具体如下表所示: | 名称 | 描述 | | ---- | ---- | | OneWay | 当源属性更改时,目标属性会更新。 | | TwoWay | 当源属性更改时,目标属性会更新;当目标属性更改时,源属性也会更新。 | | OneTime | 目标属性最初根据源属性值设置,但从那时起忽略更改。通常,当知道源属性不会更改时,使用此模式以减少开销。 | 如果将一个或多个绑定更改为使用双向绑定,在文本框中所做的更改会在焦点离开文本框时(例如,移动到另一个控件或单击按钮时)提交到内存中的对象: ```xml <TextBox Text="{Binding UnitCost, Mode=TwoWay}"></TextBox> ``` 需要注意的是,使用文本框进行双向绑定时,内存中的数据对象在文本框失去焦点之前不会被修改。但其他元素会立即执行更新,例如在列表框中进行选择、移动滑块中的拇指或更改复选框的状态时,源对象会立即被修改。 在某些情况下,需要精确控制更新的应用时间。例如,可能需要文本框在用户输入时应用更改,而不是等待焦点更改。在这种情况下,需要在代码中手动调用`BindingExpression.UpdateSource()`方法。以下是每次用户输入或编辑文本时强制文本框更新源数据对象的代码: ```csharp private void txtUnitCost_TextChanged(object sender, TextChangedEventArgs e) { BindingExpression expression = txtUnitCost.GetBindingExpression(TextBox.TextProperty); expression.UpdateSource(); } ``` 如果所有更新都通过代码进行,可以使用`Binding`对象的`UpdateSourceTrigger`属性禁用Silverlight的自动更新系统: ```xml <TextBox Text= "{Binding UnitCost, Mode=TwoWay, UpdateSourceTrigger=Explicit}"></TextBox> ``` Silverlight的`UpdateSourceTrigger`仅支持两个值:`Default`和`Explicit`,无法选择`PropertyChanged`(如WPF中那样)。但通过一些代码和`UpdateSource()`方法,可以确保在需要时进行更新。 #### 3. 数据验证 当Silverlight数据绑定系统遇到无效数据时,通常会忽略它。在编辑双向字段时,可能会出现以下三种类型的错误: - **数据类型不正确**:例如,像`UnitCost`这样的数字属性无法容纳字母或特殊字符,也不能保存极大的数字(大于1.79769313486231570E+308的数字)。 - **属性设置器异常**:例如,`UnitCost`属性可能会进行范围检查,如果尝试设置负数,会抛出异常。 - **只读属性**:此类属性根本无法设置。 由于Silverlight数据绑定系统不会提供任何视觉反馈,因此很可能会错过这些错误。不正确的值会保留在绑定控件中,但永远不会应用到绑定对象。 为避免混淆,最好尽快提醒用户他们的错误。最简单的方法是使用`Binding`对象的两个属性`ValidatesOnExceptions`和`NotifyOnValidationError`,这两个属性会告诉Silverlight使用错误通知事件。 ##### 3.1 ValidatesOnException `ValidatesOnExceptions`是实现任何类型验证的第一步。将`ValidatesOnExceptions`设置为`true`后,数据绑定系统会对任何错误做出反应,无论错误是发生在类型转换器还是属性设置器中。但当`ValidatesOnException`设置为`false`(默认值)时,数据绑定系统在遇到这些情况时会静默失败。数据对象不会更新,但违规值会保留在绑定控件中。 以下是将此属性应用于`UnitCost`绑定的示例: ```xml <TextBox Margin="5" Grid.Row="2" Grid.Column="1" x:Name="txtUnitCost" Text="{Binding UnitCost, Mode=TwoWay, ValidatesOnExceptions=True}"></TextBox> ``` 这个简单的更改使应用程序能够捕获和显示错误,前提是使用支持`ValidationState`组控件状态的控件进行双向数据绑定。无需额外工作即可支持此功能的控件包括: - `TextBox` - `PasswordBox` - `CheckBox` - `RadioButton` - `ListBox` - `ComboBox` 在验证时,控件必须支持三种状态:`Valid`、`InvalidUnfocused`和`InvalidFocused`。这些状态组成了`ValidationState`组,允许控件在包含无效数据时改变其外观。 为了更好地理解其工作原理,以包含无效数据的文本框为例。首先,考虑`Product`类的一个版本,它使用以下代码捕获负价格并抛出异常: ```csharp private double unitCost; public double UnitCost { get { return unitCost; } set { if (value < 0) throw new ArgumentException("Can't be less than 0."); unitCost = value; } } ``` 如果用户输入负数,属性设置器会抛出`ArgumentException`。由于`ValidatesOnException`设置为`true`,此异常会被数据绑定系统捕获,然后将文本框的`ValidationState`从`Valid`切换到`InvalidFocused`(如果文本框当前具有焦点)或`InvalidUnfocused`(如果文本框没有焦点)。 在未聚焦状态下,文本框会有一个深红色边框,右上角会有一个错误通知图标(一个小红三角形)。在聚焦状态下,或者当用户将鼠标悬停在错误图标上时,异常消息文本会显示在弹出的红色警报气球中。 需要注意的是,为了使红色弹出气球正常显示,文本框与浏览器窗口边缘之间必须有足够的空间。如果文本框右侧有空间,气球会显示在那里;否则,会显示在左侧。气球会显示在同一位置的任何其他元素(如按钮或标签)之上,但不能超出浏览器窗口。如果消息太长而无法在可用空间中显示,部分内容会被截断。 虽然错误弹出窗口看起来简单且非常有用,但将验证显示连接到控件模板存在一个缺点:如果想更改控件显示错误消息的方式(或完全禁用错误显示),则需要替换整个控件模板,并确保包含所有其他无关状态和标记细节。由于平均控件模板相当长,这个过程既繁琐又有潜在局限性。 ##### 3.2 NotifyOnValidationError 在将`ValidatesOnExceptions`设置为`true`后,还可以选择启用`NotifyOnValidationError`。启用后,当发生错误时,数据绑定系统会触发`BindingValidationError`事件: ```xml <TextBox Margin="5" Grid.Row="2" Grid.Column="1" x:Name="txtUnitCost" Text="{Binding UnitCost, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"></TextBox> ``` `BindingValidationError`是一个冒泡事件,这意味着可以在事件发生的位置(文本框中)或更高级别(如包含的`Grid`)处理它。在事件发生的位置处理错误,可以编写针对性的错误处理逻辑,分别处理不同字段中的错误;在更高级别处理错误(如下所示),可以为许多不同类型的错误重用相同的逻辑: ```xml <Grid Name="gridProductDetails" BindingValidationError="Grid_BindingValidationError"> ``` 当问题发生时,需要采取相应的措施。可以选择显示消息或更改应用程序某些部分的外观,但`BindingValidationError`事件的真正强大之处在于可以执
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

李_涛

知名公司架构师
拥有多年在大型科技公司的工作经验,曾在多个大厂担任技术主管和架构师一职。擅长设计和开发高效稳定的后端系统,熟练掌握多种后端开发语言和框架,包括Java、Python、Spring、Django等。精通关系型数据库和NoSQL数据库的设计和优化,能够有效地处理海量数据和复杂查询。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

【飞机缺陷检测模型压缩加速】:减小模型尺寸,加速推理过程

![【飞机缺陷检测模型压缩加速】:减小模型尺寸,加速推理过程](https://static.mianbaoban-assets.eet-china.com/xinyu-images/MBXY-CR-c3b4ad4ba4139993bf9baedd09c1c762.png) # 摘要 随着深度学习在飞机缺陷检测领域应用的增多,模型压缩和加速技术成为提升检测效率的关键。本文首先介绍了深度学习模型压缩的理论基础,包括其重要性和技术分类,随后探讨了模型加速技术实践,如深度学习框架的选择和模型剪枝、量化实践。通过应用案例分析,展示了模型压缩加速技术在实际飞机缺陷检测中的应用及其带来的性能改善。最后,

【心电信号情绪识别在虚拟现实中的应用研究】:探索虚拟世界中的情绪分析

![【心电信号情绪识别在虚拟现实中的应用研究】:探索虚拟世界中的情绪分析](https://www.radsport-rennrad.de/wp-content/uploads/2018/10/leistungstest-radsport.jpg) # 摘要 情绪识别技术与虚拟现实的结合为沉浸式体验带来了新的可能性。本文首先概述了情绪识别与虚拟现实的基本概念,接着深入探讨了心电信号(ECG)的理论基础,包括其产生原理、采集方法和数据处理技术。文中详细分析了心电信号情绪识别算法,并研究了机器学习和深度学习在情绪识别中的应用。此外,本文还探讨了心电信号情绪识别技术在虚拟现实中的实际应用,并通过具

地震正演中的边界效应分析:科学设置边界条件的深度解析

# 摘要 地震正演模拟是研究地震波在地下介质中传播规律的一种重要方法,而边界效应是影响其精度的关键因素之一。本文系统分析了边界效应的理论基础,包括边界条件的数学描述及其物理意义,并探讨了边界效应的数值模拟方法。第二章详细讨论了不同边界条件类型对模拟精度的影响,以及如何进行科学设置和优化以提高模拟精度。第四章通过案例分析,比较了不同边界条件的应用效果,并展示了边界条件优化的实际应用情况。第五章讨论了边界效应在地震工程中的应用,并提供了针对性的工程解决方案。最后,第六章对未来研究方向与展望进行了深入的探讨,提出理论深化和技术创新的建议。本文为地震正演模拟提供了全面的边界效应分析框架,并为实际应用提

OpenCvSharp三维建模技巧:点云到网格的转换秘籍

![OpenCvSharp三维建模技巧:点云到网格的转换秘籍](https://img-blog.csdnimg.cn/20210529160415937.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE0NTU1NA==,size_16,color_FFFFFF,t_70) # 摘要 本文详细探讨了使用OpenCvSharp进行三维建模的技术细节,从基础概念到高级技巧。首先介绍了三维建模的基础概念,然后深入

STM32F429 SD卡驱动安全机制揭秘:保护数据不丢失不损坏

![STM32F429 SD卡驱动安全机制揭秘:保护数据不丢失不损坏](https://static.testo.com/image/upload/c_fill,w_900,h_600,g_auto/f_auto/q_auto/HQ/Pressure/pressure-measuring-instruments-collage-pop-collage-08?_a=BATAXdAA0) # 摘要 本文介绍了STM32F429微控制器与SD卡驱动的基础知识,重点探讨了SD卡的安全机制以及在STM32F429平台上的实践开发。首先,阐述了SD卡的工作原理和数据保护机制,随后详细介绍了STM32F4

手机Modem协议在网络环境下的表现:分析与优化之道

![手机Modem协议开发快速上手.docx](https://img-blog.csdnimg.cn/0b64ecd8ef6b4f50a190aadb6e17f838.JPG?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATlVBQeiInOWTpQ==,size_20,color_FFFFFF,t_70,g_se,x_16) # 摘要 Modem协议在网络通信中扮演着至关重要的角色,它不仅定义了数据传输的基础结构,还涉及到信号调制、通信流程及错误检测与纠正机制。本文首先介

【多源数据整合王】:DayDreamInGIS_Geometry在不同GIS格式中的转换技巧,轻松转换

![【多源数据整合王】:DayDreamInGIS_Geometry在不同GIS格式中的转换技巧,轻松转换](https://community.esri.com/t5/image/serverpage/image-id/26124i748BE03C6A81111E?v=v2) # 摘要 本论文详细介绍了DayDreamInGIS_Geometry这一GIS数据处理工具,阐述了其核心功能以及与GIS数据格式转换相关的理论基础。通过分析不同的GIS数据格式,并提供详尽的转换技巧和实践应用案例,本文旨在指导用户高效地进行数据格式转换,并解决转换过程中遇到的问题。文中还探讨了转换过程中的高级技巧、

【C#数据绑定高级教程】:深入ListView数据源绑定,解锁数据处理新技能

![技术专有名词:ListView](https://androidknowledge.com/wp-content/uploads/2023/01/customlistthumb-1024x576.png) # 摘要 随着应用程序开发的复杂性增加,数据绑定技术在C#开发中扮演了关键角色,尤其在UI组件如ListView控件中。本文从基础到高级技巧,全面介绍了C#数据绑定的概念、原理及应用。首先概述了C#中数据绑定的基本概念和ListView控件的基础结构,然后深入探讨了数据源绑定的实战技巧,包括绑定简单和复杂数据源、数据源更新同步等。此外,文章还涉及了高级技巧,如数据模板自定义渲染、选中项

【仿真模型数字化转换】:从模拟到数字的精准与效率提升

![【仿真模型数字化转换】:从模拟到数字的精准与效率提升](https://img-blog.csdnimg.cn/42826d38e43b44bc906b69e92fa19d1b.png) # 摘要 本文全面介绍了仿真模型数字化转换的关键概念、理论基础、技术框架及其在实践中的应用流程。通过对数字化转换过程中的基本理论、关键技术、工具和平台的深入探讨,文章进一步阐述了在工程和科学研究领域中仿真模型的应用案例。此外,文中还提出了数字化转换过程中的性能优化策略,包括性能评估方法和优化策略与方法,并讨论了数字化转换面临的挑战、未来发展趋势和对行业的长远意义。本文旨在为专业人士提供一份关于仿真模型数

物联网技术:共享电动车连接与控制的未来趋势

![物联网技术:共享电动车连接与控制的未来趋势](https://read.nxtbook.com/ieee/potentials/january_february_2020/assets/4cf66356268e356a72e7e1d0d1ae0d88.jpg) # 摘要 本文综述了物联网技术在共享电动车领域的应用,探讨了核心的物联网连接技术、控制技术、安全机制、网络架构设计以及实践案例。文章首先介绍了物联网技术及其在共享电动车中的应用概况,接着深入分析了物联网通信协议的选择、安全机制、网络架构设计。第三章围绕共享电动车的控制技术,讨论了智能控制系统原理、远程控制技术以及自动调度与充电管理