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值绑定到这几个控件上。下面我们看源码如下:
<!--这里是数据源-->
<TextBox x:Name="tbAge" Text="" Width="" Margin="0,87,0,183" Height=""
HorizontalAlignment="Left" VerticalAlignment="Top"/>
<!--Silder控件绑定上面的tbAge控件的值-->
<Slider Name="sdAge" Value="{Binding ElementName=tbAge, Path=Text, Mode=TwoWay }"
Minimum="" Maximum="" Height="" Width="" HorizontalAlignment="Left"
VerticalAlignment="Top" Margin="0,145,0,115"></Slider>
<!--ProgressBar控件绑定上面的tbAge控件的值-->
<ProgressBar Value="{Binding Text,ElementName=tbAge,Mode=TwoWay}" Margin="0,27,0,0"
Name="progressBar1" Height="" HorizontalAlignment="Left"
VerticalAlignment="Top" Width="" />
<!--Ellipse的Width属性绑定sdAge控件的值-->
<Ellipse Width="{Binding Value,ElementName=sdAge,Mode=TwoWay}"
Height="" HorizontalAlignment="Left" Margin="0,200,0,0"
Name="ellipse1" Stroke="Black" StrokeThickness="" 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是否变化。下面我们看源码如下:
<sdk:DataGrid HorizontalAlignment="Left" AutoGenerateColumns="False" Margin="476,12,0,0"
Name="ShowListCity" VerticalAlignment="Top" Height="" Width="" >
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="省会" Binding="{Binding AddrName}" IsReadOnly="True" Width=""/>
<sdk:DataGridTextColumn Header="城市" Binding="{Binding CityName}" IsReadOnly="True" Width=""/>
<sdk:DataGridTextColumn Header="电话区号" Binding="{Binding TelNum}" IsReadOnly="True" Width=""/>
</sdk:DataGrid.Columns>
</sdk:DataGrid> <sdk:DataGrid HorizontalAlignment="Left" AutoGenerateColumns="False" Margin="476,187,0,0"
Name="ShowObservableCity" VerticalAlignment="Top" Height="" Width="" >
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="省会" Binding="{Binding AddrName}" IsReadOnly="True" Width=""/>
<sdk:DataGridTextColumn Header="城市" Binding="{Binding CityName}" IsReadOnly="True" Width=""/>
<sdk:DataGridTextColumn Header="电话区号" Binding="{Binding TelNum}" IsReadOnly="True" Width=""/>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
<Button Content="添加条目" Height="" HorizontalAlignment="Left" Margin="364,13,0,0" Name="button1"
VerticalAlignment="Top" Width="" Click="button1_Click" />
下面是MainPage.xaml.cs代码
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
ListCity = new List<CityInformation>()
{
new CityInformation(){ AddrName="四川", CityName="成都", TelNum=""},
new CityInformation(){ AddrName="北京", CityName="北京", TelNum=""},
new CityInformation(){ AddrName="广东", CityName="广州", TelNum=""}
};
ObservableCity = new ObservableCollection<CityInformation>()
{
new CityInformation(){ AddrName="四川", CityName="成都", TelNum=""},
new CityInformation(){ AddrName="北京", CityName="北京", TelNum=""},
new CityInformation(){ AddrName="广东", CityName="广州", TelNum=""}
};
this.ShowListCity.ItemsSource = ListCity;
this.ShowObservableCity.ItemsSource = ObservableCity;
} private List<CityInformation> _ListCity;
/// <summary>
/// 城市集合
/// </summary>
public List<CityInformation> ListCity
{
get { return _ListCity; }
set { _ListCity = value; }
} private ObservableCollection<CityInformation> _ObservableCity;
/// <summary>
/// 城市集合
/// </summary>
public ObservableCollection<CityInformation> ObservableCity
{
get { return _ObservableCity; }
set { _ObservableCity = value; }
}
private void button1_Click(object sender, RoutedEventArgs e)
{
ListCity.Add(new CityInformation() { AddrName = "重庆", CityName = "重庆", TelNum = "" });
ObservableCity.Add(new CityInformation() { AddrName = "重庆", CityName = "重庆", TelNum = "" });
}
}
下面我们来看CityInformation实例类代码如下:
/// <summary>
/// 城市信息的实体类
/// </summary>
public class CityInformation
{
private string _AddrName;
private string _CityName;
private string _TelNum;
/// <summary>
/// 地址名
/// </summary>
public string AddrName
{
get { return _AddrName; }
set { _AddrName = value; }
}
/// <summary>
/// 城市名
/// </summary>
public string CityName
{
get { return _CityName; }
set { _CityName = value; }
}
/// <summary>
/// 区号
/// </summary>
public string TelNum
{
get { return _TelNum; }
set { _TelNum = value; }
}
}
Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别的更多相关文章
- Silverlight实用窍门系列:2.Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)【附带实例源码】
接上节所讲的,Silverlight可以加载外部的XML文件里面的内容,那么我们可不可以在外部XML里面配置一个WebService地址,并且以此加载这个地址来动态加载WebService呢?这样子就 ...
- Silverlight实用窍门系列:57.Silverlight中的Binding使用(二)-数据验证
本文将简单讲述Silverlight中的Binding数据时的数据验证. NotifyOnValidationError:是否在出现异常/错误信息的时候激发BindingValidationError ...
- 转载 Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))
转载:程兴亮文章,地址;http://www.cnblogs.com/chengxingliang/archive/2011/02/07/1949579.html 使用WebClient读取XAP包同 ...
- Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】
使用WebClient读取XAP包同目录下的XML文件 我们想要读取XAP包下面的XML文件,需要将此XML文件放在加载XAP包的网页的目录中去,然后使用URI方式读取此URL方式下的XML文件. 首 ...
- [转载]Silverlight实用窍门系列:71.Silverlight的Style
本文版权归作者和博客园共有,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 原文链接:http://www.cnblogs.com/chengx ...
- Silverlight实用窍门系列:68.Silverlight的资源字典ResourceDictionary
允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://chengxingliang.blog.51cto.com/3972944/886643 ...
- Windows 8实用窍门系列:20.Windows 8中的GridView使用(二)和DataTemplateSelector
在本文中所讲述内容的实例仍然沿用于上篇文章,有什么疑惑可以参考上篇文章. 一 GroupStyle 在GridView控件中我们可以对数据进行分组显示,通过对GridView的GroupStyle进行 ...
- Silverlight实用示例 - DataGrid行详细信息的绑定DataGrid.RowDetailsTemplate
Silverlight实用示例 - DataGrid行详细信息的绑定DataGrid.RowDetailsTemplate 2012-12-28 21:04 来源:博客园 作者:chengxingli ...
- 系列文章--Silverlight与WCF通信
Silverlight与WCF通信(一) :Silverlight通过httpBinding访问IIS宿主WCF 摘要: 首语本人在学习Silverlight 和 WCF的时候,各种问题层出不穷,在园 ...
随机推荐
- [转贴]漫谈C语言及如何学习C语言
抄自http://my.oschina.net/apeng/blog/137911,觉得很有用,收藏它 目录:[ - ] 为什么要学习C语言? C语言学习方法 1,参考书籍 2,动手实验环境搭建 3, ...
- 详解如何用AD 生成Gerber文件
以上gerber文件就出完了; 下面步骤是:进行导出" 钻孔文件 ". 以上钻孔文件就出完了; 到此就全部完成输出了. 下面的操作,也可以不用导的 .下面步骤是:进行导出&qu ...
- Qt创建窗体的过程
版权声明 本文为原创作品,请尊重作者的劳动成果.转载必须保持文章完整性,并以超链接形式注明原始作者“ tingsking18”和 主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口 ...
- Java中x+=y和x=x+y两种实现的区别
先看下边两段代码,各有什么错? 例一: short s1 = 1; s1 = s1 + 1; 例二: short s1 = 1; s1 += 1; 第一段代码无法通过编译,由于 s1+1 在运算时会自 ...
- openCV python 安装
0, 用 import cv 测试,发现没有安装 opencv 模块. 首先先说本开发环境是在windows xp的环境下进行搭建的. 在搭建的过程中需要保证这三个条件: 1.python需要安装py ...
- [置顶] linux内核启动1-启动参数(启动参数的获取和处理,分析setup_arch)
最近公司要求调试一个内核,启动时有问题,所以就花了一点时间看看内核启动. 看的过程中总结了一点东西,希望可以帮助大家调试内核. 当我开始看的时候,第一件事是从网上搜集资料,不看不知道,一看吓一跳!牛人 ...
- CentOS6.5 x86_64 配置Broadcom 43XX系列 无线网卡驱动
from: http://wiki.centos.org/HowTos/Laptops/Wireless/Broadcom?action=show In order to install Broadc ...
- 汉企C#面向对象——继承Practice
class Dianqi //创建电器类:父类 { private string _Dianqimingzi; public string Dianqimingzi { get { return _D ...
- sql server 2008中id如何设为自增
通过 IDENTITY 来设置 参数有2个,一个是“初始值” 一个是“增量”.默认情况下 INSERT 语句中,不能对 IDENTITY 的字段进行赋值. create table web_produ ...
- Android Loader详解三:重启与回调
重启装载器 当你使用initLoader()时,如果指定ID的装载器已经存在,则它使用这个装载器.如果不存在呢,它将创建一个新的.但是有时你却是想丢弃旧的然后开始新的数据. 要想丢弃旧数据,你应使用r ...