Silverlight 通过索引器绑定动态数据

转自http://www.cnblogs.com/forgetu/archive/2011/06/18/silverlight-binding-dynamic-object-anonymous-class.html

绑定动态数据是做 Silverlight 程序时经常会遇到的问题。本文介绍 Silverlight 通过绑定索引器实现绑定动态数据,即在设计时不知道数据的结构,如在设计时不知道要绑定的类有哪些属性。

绑定索引器是 Silverlight 4 新增的特性,这一特性使用我们可以在设计时不必知道要绑定的类有哪些属性,但是还可以绑定。下面先看一下如何绑定索引器。

1 <TextBox Grid.Row="0" Height="23" Width="148"
2             HorizontalAlignment="Center" VerticalAlignment="Center"
3             Name="txtName" Text="<span style="color: #ff0000;" color="#ff0000">{Binding Path=[name]}</span>" />
4 <TextBox Grid.Row="1" Height="23" Width="148"
5             HorizontalAlignment="Center" VerticalAlignment="Center"
6             Name="txtAge" Text="<span style="color: #ff0000;" color="#ff0000">{Binding Path=[age]}</span>" />

绑定索引器的语法和通常绑定数据的语法非常相似,格式为:Binding="{Binding Path=[Key]}" 。下面新建一个要绑定的 Person 类,并添加一个索引器,完整的代码如下:

01 public class Person : INotifyPropertyChanged
02 {
03     private Dictionary<string, object> data = new Dictionary<string, object>();
04  
05     public object this[string key]
06     {
07         get
08         {
09             if (!data.ContainsKey(key))
10                 data[key] = null;
11  
12             return data[key];
13         }
14         set
15         {
16             data[key] = value;
17             NotifyPropertyChanged("");
18         }
19     }
20  
21     public string[] Keys
22     {
23         get
24         {
25             return data.Keys.ToArray();
26         }
27     }
28  
29     public event PropertyChangedEventHandler PropertyChanged;
30  
31     public void NotifyPropertyChanged(string propertyName)
32     {
33         if (PropertyChanged != null)
34             PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
35     }
36 }

下面新建一个 Person 类的实例,并绑定到第一段代码创建的两个TextBox上面。

1 Person person = new Person();
2 person["name"] = "avatar";
3 person["age"] = 123456;
4  
5 LayoutRoot.DataContext = person;

运行结果如下:

上面的代码将索引器的参数名直接写在代码中了,如果在设计时不知道类的结构,上面的代码依然无法解决问题。我们可以通过下面的代码轻松解决这个问题:

01 Person person = new Person();
02 person["name"] = "avatar";
03 person["age"] = 123456;
04  
05 LayoutRoot.DataContext = person;
06  
07 for (int i = 0; i < person.Keys.Length; i++)
08 {
09     TextBox txt = new TextBox()
10     {
11         Width = 200,
12         HorizontalAlignment = HorizontalAlignment.Center,
13         VerticalAlignment = VerticalAlignment.Center
14     };
15     Binding binding = new Binding("[" + person.Keys[i] + "]")
16     {
17         Mode = BindingMode.TwoWay
18     };
19     txt.SetBinding(TextBox.TextProperty, binding);
20  
21     txt.SetValue(Grid.RowProperty, i);
22     LayoutRoot.Children.Add(txt);
23 }

这段代码的运行结果和上面的代码的运行结果完全一样。

以上讲的是通过索引器将单个类绑定到 Silverlight 控制上,如果要将包含多个类的列表绑定到 DataGrid 上呢?这个问题我们可以通过类似的方式轻松解决。下面是将多个类的列表绑定到 DataGrid 上的代码:

1 private List<Person> lst = new List<Person>();
01 Person person1 = new Person();
02 person1["name"] = "Avatar";
03 person1["age"] = 52342;
04  
05 Person person2 = new Person();
06 person2["name"] = "Harry Potter";
07 person2["age"] = 33432;
08  
09 lst.Add(person1);
10 lst.Add(person2);
11  
12 string[] headers = person1.Keys;
13 for (int i = 0; i < headers.Length; i++)
14 {
15     dataGrid1.Columns.Add(new DataGridTextColumn()
16     {
17         Header = headers[i],
18         CanUserSort = true,
19         IsReadOnly = false,
20         Binding = new Binding("[" + headers[i] + "]")
21         {
22             Mode = BindingMode.TwoWay
23         }
24     });
25 }
26  
27 dataGrid1.ItemsSource = lst;

注意:如果想让用户可以点击表头排序,需要设置每一列的 CanUserSort = true 。运行结果如下图:

如果需要显示 Person 类的性别,只需在上面的代码中添加:person1["gender"] = "男"; person2["gender"] = "男"; 就可以实现,运行结果如下:

示例代码下载:SLBindingDynamicObject.7z

 

时间: 2024-10-03 10:52:05

Silverlight 通过索引器绑定动态数据的相关文章

Silverlight实例教程 - Validation客户端同步数据验证

Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础属性和事件 Silverlight实例教程 - Validation数据验证DataAnnotation机制和调试技巧 Silverlight实例教程 - Validation客户端同步数据验证 Silverlight实例教程 - Validation服务器端异步数据验证 Silverlight实例

用asp+javascript实现动态数据联动,不刷新

javascript|动态|数据|刷新 /////////////by xxrl(孔曰成仁,孟曰取E) /////////////Chinese:蒋健华 /////////////email:jjh_115@eyou.com 联动,联动,联动....困扰了好多网友的神经,在CSDN-ASP板块中,总是看到网友们大呼救命,救什么?联动!为什么联动这样受到关注,其实用性无可非议,用户也能认可,可是如果数据是大量并相互关联的,那问题就来了,怎么识别并显示是一个很苦恼的问题.那究竟有没有一个很好的解决办

C#锐利体验之第八讲 索引器与操作符重载

索引 索引器 索引器(Indexer)是C#引入的一个新型的类成员,它使得对象可以像数组那样被方便,直观的引用.索引器非常类似于我们前面讲到的属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.下面是典型的索引器的设计,我们在这里忽略了具体的实现. class MyClass{    public object this [int index]    {        get        {            // 取数据        }        set  

SEOer需要了解搜索引擎的索引器

一个合格的SEOer需要对搜索引擎的结构有一定的了解,这样在进行seo时可以做到心中有数,有条不紊,而不必拘泥于固定的优化方法和技巧.而此时要分析的索引器,它是搜索引擎结构中一个比较重要部分. 索引 器第对搜索引擎是比较重要的,比如:我们熟悉的百度新闻,它是"由机器每5分钟自动选取更新",比较具有实时性,并且数据量也是相当的大.此时索引器的算法对索引器的影响就显得十分突出了.因此有人说,一个搜索引擎的有效性在很大的程度上取决于索引器的质量(精确的说应该归功于索引器的索引算法). 下面我

创建动态数据输入用户界面

创建|动态|数据 下载实例 简介 当创建数据驱动的 Web 站点时,Web 开发人员遇到的最常见的任务之一就是创建数据输入窗体.数据输入窗体是为系统用户提供数据输入方法的 Web 页.创建特定数据输入窗体的任务通常应该先从需求分析入手,即,明确指出需要从用户收集何种信息.需求确定之后,下一步是设计数据输入 Web 窗体,包括创建图形用户界面以及编写根据用户输入更新数据库的代码. 当数据输入窗体需求事先已知,并且此数据输入窗体对系统中所有用户都一样时,创建这样的输入窗体就毫无挑战性.然而,如果需要

C#下的BitArray类:实现索引器和位操作

System.Collections命名空间下的BitArray相当于一个bool类型的数组bool[].MSDN用 BitArray做例子实现了一个索引器,今天研究了一下这个例子,对原来的实现做了一些改变 ,将>> 5操作变成了mod 32,敝人以为这样看起来会更直观. 代码如下: public class MyBitArray { private int[] m_Bits; private int m_Length; public MyBitArray(int length) { //Co

使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示

原文:使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示   首先来看一看实现的效果: PS:原始的程序中更新曲线数据时添加了过渡的效果,具体可查看官网的示例: http://www.visifire.com/silverlight_spline_charts_gallery.php 点击其中的一个例子,然后点击Live Updates,就可看到数据更新时的过渡效果.但是蛋疼的博客园,不知道为什么,我插入了我原始的xap文件,过渡效果却

《Core Data应用开发实践指南》一3.5 通过迁移管理器来迁移数据

3.5 通过迁移管理器来迁移数据 除了通过NSPersistentStoreCoordinator来迁移存储区之外,还可以采用迁移管理器来做.迁移管理器可以使开发者全权掌控迁移过程中创建的文件,从而令他们能够按自己的方式来灵活处理迁移中的各种问题.使用迁移管理器的一个好处就是可以向用户报告迁移进度,使用户知道应用程序哪次会启动得比较慢一些,所以需要耐心等待.虽说迁移过程理应执行得非常快才对,但当数据库比较大.变动比较复杂时,迁移过程就需要耗费一定的时间了.为了使用户界面保持流畅,迁移过程必须在后

《.NET程序员面试秘笈》----面试题13 举例说明索引器的作用

面试题13 举例说明索引器的作用 .NET程序员面试秘笈 [考点]索引器的理解,this在索引器中的作用. [出现频率] [解答] 索引器可以使客户程序很方便地访问类中的集合或数组,访问方法类似于通过索引访问数组,并且索引器向客户程序隐藏了内部的数据结构.索引器和属性同样使用get和set访问器读取.写入值,不过索引器的get和set访问器必须具有与索引器相同的形参表.但是属性可以为静态成员,而索引器必须为实例成员.索引器不支持类似于属性的自动实现的语法. 说明: 形参表即为声明索引器时接收的形