開篇
在任何的BS項目的開發中,怎么把后台的數據展示到前端,都是無法避免的甚至有時候讓人頭疼的問題。考慮到這點,Silverlight中微軟給予了我們Binding這一偉大的特性。借助他,讓我們可以用非常優雅的方式處理數據的展示.....。我們知道,Binding是溝通Xaml和數據源的橋梁,而大部分時候,我們的數據源都是一個實體類實例或者實體類實例集合。故在我們潛意識里,要展示一份數據,幾乎必須寫實體類不可。本文的目的就是使用一種‘巧妙的方式’,讓我們不寫實體類也可以Bingding.....從而顯示數據。
准備
我們的目的非常簡單,寫一個方法,傳入字符串的JSON數據,讓DataGrid顯示數據。Json數據如下。特別注意該JSON格式。JSON數據如下。
View Code
[ { "PersonAidsID": "ff9619ff-8b46-d011-b42d-00c04fc934f1", "IDNum": "594832934875849485", "Sex": "1", "RecordTime": "2012/2/28 10:29:34", "Address": "合額度126號", "Name": "陳-冠-希是你", "Age": "34", "GeographicLocation": "43.887594849178,81.3012265555597", "IllnessNarratives": "2", "得病類型": "", "民族": "", "吸毒史": "", "VillageID": "ff9619ff-8b46-d011-b42d-00c04fc934f6" }, { "PersonAidsID": "ff9619ff-8b46-d011-b42d-00c04fc934f1", "IDNum": "594832934875849485", "Sex": "1", "RecordTime": "2012/2/28 10:29:34", "Address": "合額度126號", "Name": "陳-冠-希是你", "Age": "34", "GeographicLocation": "43.887594849178,81.3012265555597", "IllnessNarratives": "2", "得病類型": "", "民族": "", "吸毒史": "", "VillageID": "ff9619ff-8b46-d011-b42d-00c04fc934f6" }, { "PersonAidsID": "ff9619ff-8b46-d011-b42d-00c04fc934f1", "IDNum": "594832934875849485", "Sex": "1", "RecordTime": "2012/2/28 10:29:34", "Address": "合額度126號", "Name": "陳-冠-希是你", "Age": "34", "GeographicLocation": "43.887594849178,81.3012265555597", "IllnessNarratives": "2", "得病類型": "", "民族": "", "吸毒史": "", "VillageID": "ff9619ff-8b46-d011-b42d-00c04fc934f6" }, { "PersonAidsID": "ff9619ff-8b46-d011-b42d-00c04fc934f1", "IDNum": "594832934875849485", "Sex": "1", "RecordTime": "2012/2/28 10:29:34", "Address": "合額度126號", "Name": "陳-冠-希是你", "Age": "34", "GeographicLocation": "43.887594849178,81.3012265555597", "IllnessNarratives": "2", "得病類型": "", "民族": "", "吸毒史": "", "VillageID": "ff9619ff-8b46-d011-b42d-00c04fc934f6" }, { "PersonAidsID": "ff9619ff-8b46-d011-b42d-00c04fc934f1", "IDNum": "594832934875849485", "Sex": "1", "RecordTime": "2012/2/28 10:29:34", "Address": "合額度126號", "Name": "陳-冠-希是你", "Age": "34", "GeographicLocation": "43.887594849178,81.3012265555597", "IllnessNarratives": "2", "得病類型": "", "民族": "", "吸毒史": "", "VillageID": "ff9619ff-8b46-d011-b42d-00c04fc934f6" }, { "PersonAidsID": "ff9619ff-8b46-d011-b42d-00c04fc934f1", "IDNum": "594832934875849485", "Sex": "1", "RecordTime": "2012/2/28 10:29:34", "Address": "合額度126號", "Name": "陳-冠-希是你", "Age": "34", "GeographicLocation": "43.887594849178,81.3012265555597", "IllnessNarratives": "2", "得病類型": "", "民族": "", "吸毒史": "", "VillageID": "ff9619ff-8b46-d011-b42d-00c04fc934f6" }, { "PersonAidsID": "ff9619ff-8b46-d011-b42d-00c04fc934f1", "IDNum": "594832934875849485", "Sex": "1", "RecordTime": "2012/2/28 10:29:34", "Address": "合額度126號", "Name": "陳-冠-希是你", "Age": "34", "GeographicLocation": "43.887594849178,81.3012265555597", "IllnessNarratives": "2", "得病類型": "", "民族": "", "吸毒史": "", "VillageID": "ff9619ff-8b46-d011-b42d-00c04fc934f6" }, { "PersonAidsID": "ff9619ff-8b46-d011-b42d-00c04fc934f1", "IDNum": "594832934875849485", "Sex": "1", "RecordTime": "2012/2/28 10:29:34", "Address": "合額度126號", "Name": "陳-冠-希是你", "Age": "34", "GeographicLocation": "43.887594849178,81.3012265555597", "IllnessNarratives": "2", "得病類型": "", "民族": "", "吸毒史": "", "VillageID": "ff9619ff-8b46-d011-b42d-00c04fc934f6" }, { "PersonAidsID": "ff9619ff-8b46-d011-b42d-00c04fc934f1", "IDNum": "594832934875849485", "Sex": "1", "RecordTime": "2012/2/28 10:29:34", "Address": "合額度126號", "Name": "陳-冠-希是你", "Age": "34", "GeographicLocation": "43.887594849178,81.3012265555597", "IllnessNarratives": "2", "得病類型": "", "民族": "", "吸毒史": "", "VillageID": "ff9619ff-8b46-d011-b42d-00c04fc934f6" } ]
服務端:
特別注意我的服務端..... 就是一個ASPX的頁面。然后使用Response.Write 的方法向客戶端輸送數據。個人覺得這種方式簡單又靈活。比起WCF。
最后的服務端如下
![]()
客戶端取得數據:
string dataUrl = HtmlPage.Document.DocumentUri.AbsoluteUri.Replace("Default.aspx", "Handler/Data.aspx");
WebClient webClient = new WebClient();
webClient.DownloadStringAsync(new Uri(dataUrl));
webClient.DownloadStringCompleted += (sender1, e1) =>
{
MessageBox.Show(e1.Result);
};
呵呵這寫法非常常見。 但值得各位注意的是:
string dataUrl = HtmlPage.Document.DocumentUri.AbsoluteUri.Replace("Default.aspx", "Handler/Data.aspx");
這個寫法。這樣的話,不管換哪個IP,都不會有問題。
反射實體類來咯
上面客戶端已經可以取得數據了。接下來要做的就是怎么把JSON轉換為實體類實例集合。
有三步工作要做。
1:從JSON中獲得列頭。(見代碼中GetCoumsByJson 方法)
2:從列頭反射形成實體類。(見代碼中getTypeByStrList方法)
3:反序列化形成實體類集合。
下面直接上代碼。怎么做的。看代碼便知。
http://files.cnblogs.com/MySilverlight/SilverlightApplication2.zip
諸位看看代碼便知。注意跑起來之后瀏覽首頁要點擊一下那個按鈕才顯示數據哦
會影響性能嗎?
基本不會。因為即便是使用反射形成實體類。但請注意,這里是使用的Emit的方式。這種反射方式不咋影響性能....。
后話:這算做是我框架介紹的開篇.... 呵呵 一共五偏 呵呵