Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别

简介:

     问题一:在某一些情况下,我们使用MVVM模式的时候,对于某一个字段(AgeField)需要在前台的很多个控件(A、B、C、D、E)进行绑定,但是如何能够让我们后台字段名改变的时候能够非常方便的改变所有使用了这个字段的控件呢?

        回答:使用Element to Element Binding,将AgeFiled绑定到A控件,然后再让B、C、D、E控件绑定A控件的使用AgeField字段的属性。

        例如:字段(AgeField)的数据是年龄大小,A、B、C、D、E控件分别是 Ellipse、Label、Slider、TextBox、ProgressBar,这些字段的Width、Value或者Text值按照常规的做法, 这几个控件都是在MVVM模式下都是绑定的AgeField。但是这个字段名在后期代码维护的时候修改为Age了,我们就不得不需要一一修改五个控件的绑 定值。如果这几个控件还分布在不同位置,那么寻找起来就将更加麻烦。那么这里我们就将使用到Silverlight 3的一个新特性Element to Element Binding。

        实例一:我们在这里有一个TextBox控件tbAge,其Value值假定绑定到某一个字 段,然后我们再添加Slider、ProgressBar、Ellipse控件,使用Value="{Binding Text,ElementName=tbAge,Mode=TwoWay}"这样的方式将tbAge的Text值绑定到这几个控件上。下面我们看源码如 下:

 


 
 
  1. <!--这里是数据源--> 
  2. <TextBox x:Name="tbAge" Text="30"  Width="80" Margin="0,87,0,183" Height="30" 
  3.          HorizontalAlignment="Left"  VerticalAlignment="Top"/> 
  4. <!--Silder控件绑定上面的tbAge控件的值--> 
  5. <Slider   Name="sdAge" Value="{Binding ElementName=tbAge, Path=Text, Mode=TwoWay }" 
  6.           Minimum="1" Maximum="100" Height="40" Width="210" HorizontalAlignment="Left" 
  7.           VerticalAlignment="Top" Margin="0,145,0,115"></Slider> 
  8. <!--ProgressBar控件绑定上面的tbAge控件的值--> 
  9. <ProgressBar Value="{Binding Text,ElementName=tbAge,Mode=TwoWay}" Margin="0,27,0,0" 
  10.              Name="progressBar1" Height="24" HorizontalAlignment="Left" 
  11.              VerticalAlignment="Top" Width="210" /> 
  12. <!--Ellipse的Width属性绑定sdAge控件的值--> 
  13. <Ellipse  Width="{Binding Value,ElementName=sdAge,Mode=TwoWay}"  
  14.           Height="100" HorizontalAlignment="Left" Margin="0,200,0,0"  
  15.           Name="ellipse1" Stroke="Black" StrokeThickness="1" VerticalAlignment="Top" /> 

        问题二:为什么在Silverlight中我们更常用ObservableCollection<T>来作为数据集合绑定到控件中,而不是使用List<T>呢?

        回答:当T继承于INotifyPropertyChanged接口的时候,如果T的属性值发 生变化时,ObservableCollection和List都能够让前台UI发生相应的改变。但是当增加一个T的数据行时,List不能及时更新前台 UI,而ObservableCollection能够将新增的T数据行马上更新到UI上去。

        实例二:我们拖出两个DataGrid控件分别是ShowListCity和ShowObservableCity,然后分别绑定数据List和Observable数据,再添加一个按钮为这两个数据集合添加集合值。看UI是否变化。下面我们看源码如下:

 


 
 
  1. <sdk:DataGrid HorizontalAlignment="Left"  AutoGenerateColumns="False"  Margin="476,12,0,0" 
  2.                       Name="ShowListCity" VerticalAlignment="Top"  Height="169"  Width="324" > 
  3.             <sdk:DataGrid.Columns> 
  4.                 <sdk:DataGridTextColumn Header="省会" Binding="{Binding AddrName}" IsReadOnly="True" Width="108"/> 
  5.                 <sdk:DataGridTextColumn Header="城市" Binding="{Binding CityName}" IsReadOnly="True" Width="108"/> 
  6.                 <sdk:DataGridTextColumn Header="电话区号" Binding="{Binding TelNum}" IsReadOnly="True" Width="108"/> 
  7.             </sdk:DataGrid.Columns> 
  8.         </sdk:DataGrid> 
  9.  
  10.         <sdk:DataGrid HorizontalAlignment="Left"  AutoGenerateColumns="False"  Margin="476,187,0,0" 
  11.                       Name="ShowObservableCity" VerticalAlignment="Top"  Height="180"  Width="324" > 
  12.             <sdk:DataGrid.Columns> 
  13.                 <sdk:DataGridTextColumn Header="省会" Binding="{Binding AddrName}" IsReadOnly="True" Width="108"/> 
  14.                 <sdk:DataGridTextColumn Header="城市" Binding="{Binding CityName}" IsReadOnly="True" Width="108"/> 
  15.                 <sdk:DataGridTextColumn Header="电话区号" Binding="{Binding TelNum}" IsReadOnly="True" Width="108"/> 
  16.             </sdk:DataGrid.Columns> 
  17.         </sdk:DataGrid> 
  18.         <Button Content="添加条目" Height="23" HorizontalAlignment="Left" Margin="364,13,0,0" Name="button1" 
  19.                 VerticalAlignment="Top" Width="75" Click="button1_Click" /> 

        下面是MainPage.xaml.cs代码

 


 
 
  1. public partial class MainPage : UserControl 
  2.     public MainPage() 
  3.     { 
  4.         InitializeComponent(); 
  5.         ListCity = new List<CityInformation>() 
  6.         { 
  7.             new CityInformation(){ AddrName="四川", CityName="成都", TelNum="028"}, 
  8.             new CityInformation(){ AddrName="北京", CityName="北京", TelNum="010"}, 
  9.             new CityInformation(){ AddrName="广东", CityName="广州", TelNum="021"
  10.         }; 
  11.         ObservableCity = new ObservableCollection<CityInformation>() 
  12.         { 
  13.             new CityInformation(){ AddrName="四川", CityName="成都", TelNum="028"}, 
  14.             new CityInformation(){ AddrName="北京", CityName="北京", TelNum="010"}, 
  15.             new CityInformation(){ AddrName="广东", CityName="广州", TelNum="021"
  16.         }; 
  17.         this.ShowListCity.ItemsSource = ListCity; 
  18.         this.ShowObservableCity.ItemsSource = ObservableCity; 
  19.     } 
  20.  
  21.     private List<CityInformation> _ListCity; 
  22.     /// <summary> 
  23.     /// 城市集合 
  24.     /// </summary> 
  25.     public List<CityInformation> ListCity 
  26.     { 
  27.         get { return _ListCity; } 
  28.         set { _ListCity = value; } 
  29.     } 
  30.  
  31.     private ObservableCollection<CityInformation> _ObservableCity; 
  32.     /// <summary> 
  33.     /// 城市集合 
  34.     /// </summary> 
  35.     public ObservableCollection<CityInformation> ObservableCity 
  36.     { 
  37.         get { return _ObservableCity; } 
  38.         set { _ObservableCity = value; } 
  39.     } 
  40.     private void button1_Click(object sender, RoutedEventArgs e) 
  41.     { 
  42.         ListCity.Add(new CityInformation() { AddrName = "重庆", CityName = "重庆", TelNum = "022" }); 
  43.         ObservableCity.Add(new CityInformation() { AddrName = "重庆", CityName = "重庆", TelNum = "022" }); 
  44.     } 

         下面我们来看CityInformation实例类代码如下:

 


 
 
  1. /// <summary>   
  2. /// 城市信息的实体类   
  3. /// </summary>   
  4. public class CityInformation 
  5.     private string _AddrName; 
  6.     private string _CityName; 
  7.     private string _TelNum; 
  8.     /// <summary> 
  9.     /// 地址名 
  10.     /// </summary> 
  11.     public string AddrName 
  12.     { 
  13.         get { return _AddrName; } 
  14.         set { _AddrName = value; } 
  15.     } 
  16.     /// <summary> 
  17.     /// 城市名 
  18.     /// </summary> 
  19.     public string CityName 
  20.     { 
  21.         get { return _CityName; } 
  22.         set { _CityName = value; } 
  23.     } 
  24.     /// <summary> 
  25.     /// 区号 
  26.     /// </summary> 
  27.     public string TelNum 
  28.     { 
  29.         get { return _TelNum; } 
  30.         set { _TelNum = value; } 
  31.     } 
  32. }  

          最后我们来看看运行效果如何,另外如需源码请点击 SLElement.zip 下载 .

 


本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/826745



相关文章
|
7月前
|
机器学习/深度学习 计算机视觉 索引
YOLOv11改进策略【Conv和Transformer】| ECCV-2024 Histogram Transformer 直方图自注意力 适用于噪声大,图像质量低的检测任务
YOLOv11改进策略【Conv和Transformer】| ECCV-2024 Histogram Transformer 直方图自注意力 适用于噪声大,图像质量低的检测任务
351 9
YOLOv11改进策略【Conv和Transformer】| ECCV-2024 Histogram Transformer 直方图自注意力 适用于噪声大,图像质量低的检测任务
|
8月前
|
人工智能 自然语言处理 数据库
CHRONOS:阿里通义联合上海交大推出时间线摘要生成框架,适用于大规模新闻数据的时间线生成任务
CHRONOS 是由阿里通义实验室与上海交大联合推出的时间线摘要生成框架,支持开放域与封闭域,通过迭代自问自答机制生成连贯的时间线摘要,适用于新闻、金融、教育等多个领域。
423 15
CHRONOS:阿里通义联合上海交大推出时间线摘要生成框架,适用于大规模新闻数据的时间线生成任务
|
8月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的高校食堂移动预约点餐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
8月前
|
监控 API 数据处理
速卖通商品数据尽在掌握:揭秘高效利用API接口获取详情策略
速卖通(AliExpress)API助力电商数据处理与分析,提供商品搜索、价格监控等功能。开发者需注册账号、创建应用并获取API Key。常用接口包括商品搜索和详情API。调用时注意频率限制、数据延迟及错误处理。本文介绍全过程并附Python示例代码,帮助提升电商运营效率。
|
9月前
|
人工智能 API 开发者
用 OpenVINO™ 部署 GLM-Edge 全家桶
11月29日,智谱发布了GLM-Edge系列模型,包括GLM-Edge-1.5B-Chat、GLM-Edge-4B-Chat、GLM-Edge-V-2B、GLM-Edge-V-5B,适用于手机、车机及PC平台。文章介绍了如何使用OpenVINO™工具套件在本地部署这些模型,实现高效的AI任务处理,如聊天与图像理解。提供了详细的环境配置、模型转换与量化、以及具体的应用示例。
303 16
|
9月前
|
存储 安全 物联网
未来已来:区块链技术在物联网与虚拟现实中的应用
随着科技的不断进步,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正在逐渐改变我们的生活和工作方式。本文将探讨这些技术的发展趋势和应用场景,以及它们如何相互融合,为我们带来更便捷、安全和沉浸式的体验。
|
9月前
|
缓存 负载均衡 安全
什么是反向代理
反向代理是一种部署在服务器前端的代理技术,它接收客户端请求并转发给内部服务器,对外隐藏真实服务器。其主要功能包括负载均衡、安全防护和缓存加速,有效提升服务器性能和安全性。
547 5
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
智能语音识别技术在多语言环境下的挑战与优化策略###
随着全球化的加速推进,智能语音识别技术作为人机交互的关键一环,其跨语言适应性成为了研究热点。本文深入探讨了智能语音识别技术在多语言环境下面临的挑战,包括口音差异、词汇多样性、语法结构复杂性等,并提出了相应的优化策略。通过对比分析不同算法和技术路线,本文旨在为提升智能语音识别系统的跨语言性能提供理论依据和实践指导。 ###
|
10月前
|
存储 供应链 安全
StarTowerChain:DePIN 引领下的区块链璀璨之星
StarTowerChain 是基于 DePIN 理念的区块链项目,通过将分散的智能设备转化为强大节点,实现资源共享与协作。它采用先进的加密技术和分布式存储,确保数据安全和系统稳定性。StarTowerChain 应用于数字货币交易、供应链金融和物联网等领域,提供安全、高效的服务,并通过社区参与推动持续创新。
|
11月前
|
机器学习/深度学习 人工智能 搜索推荐
智能CRM系统排名2024:AI技术如何提升客户管理
在数字化时代,人工智能(AI)技术正逐渐成为企业提升客户管理能力的关键因素。智能CRM系统通过集成AI技术,不仅能够自动化日常任务,还能提供深入的客户洞察,从而帮助企业实现更高效的销售和更个性化的客户服务。AI技术在CRM系统中的应用包括:24/7的自动化客户服务、客户行为分析、个性化推荐以及销售预测和管道管理。根据2024年市场表现和用户反馈,纷享销客、用友CRM、金蝶CRM、悟空CRM、普华基石CRM、珍客CRM、八百客CRM和销帮帮CRM等智能CRM系统表现出色。其中,纷享销客凭借先进的AI技术成为行业领导者。企业应积极探索AI与CRM的集成,实现客户管理的数字化转型。