BITED-Windows8应用开发学习札记之三:如何在Win8应用中实现数据绑定

  在微软官方提供的资源中,我们可以看到SampleDataSource.cs已经拥有了定义好了相应的数据结构以及实现类:

  

  建立本地数据

  由于我们已经有数据以及相应的数据类,我们需要做的仅仅是将数据放进数据类中,并在数据源的构造函数中调用它:

  首先定义一个方法,用来绑定本地数据:

1 public SampleDataSource()
2         {
3             // Loca local data
4             GetLocalFiles();
5         }

  为了使界面运行起来不影响效果,需要通过添加async关键字来进行操作。

  其余解析均用注释的方式表示在代码中:

 1 public async Task GetLocalFiles()
 2         {
 3             string folderIndex = "Index_"; // Foler filter
 4             var Path = @"Data"; //Binding Folder
 5  
 6             var Folders = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(Path).GetResults().GetFoldersAsync();
 7             
 8             //对于每个folder分别取出
 9             foreach (var folder in Folders)
10             {
11                 var group = new SampleDataGroup(folder.Name, folder.Name, "", "", "");
12                 var files = await folder.GetFilesAsync();
13 
14                 //对每个文件也需要分别取出
15                 foreach (var file in files)
16                 {
17                     //判断文件类型是否为文本形式
18                     if (!file.FileType.Equals(TXTFILEEXTENSION))
19                     {
20                         string filename = file.Name.Split(new char[] { '.' })[0];
21 
22                         //判断文件名是否包括_index
23                         if (filename.Contains(folderIndex))
24                         {
25                             group.SetImage("/" + Path + "/" + folder.Name + "/" + file.Name);
26                         }
27                         else
28                         {
29                             var pictureItem = new SampleDataItem(filename, filename, "",
30                                 "/" + Path + "/" + folder.Name + "/" + file.Name, "", "", group);
31                             group.Items.Add(pictureItem);
32                         }
33                     }
34                 }
35 
36                 //文本情况的操作
37                 foreach (var file in files)
38                 {
39                     if (file.FileType.Equals(TXTFILEEXTENSION))
40                     {
41                         string filename = file.Name.Split(new char[] { '.' })[0];
42                         if (filename.Contains("Index_"))
43                         {
44                             group.Description = await Windows.Storage.FileIO.ReadTextAsync(file);
45                         }
46                         else
47                         {
48                             var item = group.Items.First<SampleDataItem>(i => i.Title.Split(new char[] { '.' })[0] == filename);
49                             item.Description = item.Content = await Windows.Storage.FileIO.ReadTextAsync(file);
50                         }
51                     }
52                 }
53                 //最后把所有数据绑定到AllGroups中
54                 _sampleDataSource.AllGroups.Add(group);
55             }
56         }

 

  

  

  建立SKYDRIVE数据

  首先,在SKYDRIVE中存入同名的文件,并在本地进行reference。同时需要注意的是:我们需要在网上下载一个LIVE SDK,具体操作如下:

  1. 在  http://msdn.microsoft.com/en-US/live/ff621310 页面 下载Live SDK并安装。
  2. 在你的工程里面引用此Live SDK。
  3. 进入https://manage.dev.live.com/build?wa=wsignin1.0,配置你的项目可以调用SKYDRIVE SDK,注意在STEP3中,我们只有Package Name可以填入,其他两个可以忽视

  然后写代码读取数据,并在构造函数中调用InitAuth()方法(请先将GetLocalFiles()注释掉)

  微软官网给出的代码修改如下:

  1         #region GetRemote Files
  2         private async void InitAuth()
  3         {
  4             if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled)
  5             {
  6                 LiveAuthClient authClient = new LiveAuthClient();
  7                 LiveLoginResult authResult = await authClient.LoginAsync(new List<string>() { "wl.signin", "wl.skydrive" });
  8                 if (authResult.Status == LiveConnectSessionStatus.Connected)
  9                 {
 10                     App.Session = authResult.Session;
 11                 }
 12                 // Forece to logout then login
 13                 authClient.Logout();
 14                 authResult = await authClient.LoginAsync(new List<string>() { "wl.signin", "wl.skydrive" });
 15                 LoadProfile();
 16             }
 17         }
 18 
 19         private async void LoadProfile()
 20         {
 21             // We may use this code later, but comment them here.
 22             //LiveConnectClient client = new LiveConnectClient(App.Session);
 23             //LiveOperationResult liveOpResult = await client.GetAsync("me");
 24             //dynamic dynResult = liveOpResult.Result;
 25             //App.UserName = dynResult.name;
 26             LoadData();
 27         }
 28 
 29         public async void LoadData()
 30         {
 31             LiveConnectClient client = new LiveConnectClient(App.Session);
 32 
 33             LiveOperationResult albumOperationResult = await client.GetAsync("me/albums");
 34             dynamic albumResult = albumOperationResult.Result;
 35             foreach (dynamic album in albumResult.data)
 36             {
 37                 if (album.name == "TravelJourney")
 38                 {
 39                     LiveOperationResult travelJourneyOperationResult = await client.GetAsync(album.id + "/files");
 40                     dynamic travelJourneyResult = travelJourneyOperationResult.Result;
 41                     foreach (dynamic subalbum in travelJourneyResult.data)
 42                     {
 43                         var group = new SampleDataGroup(subalbum.id, subalbum.name, "", @"ms-appx:///Assets/DarkGray.png", subalbum.description);
 44                         LiveOperationResult pictureOperationResult = await client.GetAsync(subalbum.id + "/files");
 45                         dynamic pictureResult = pictureOperationResult.Result;
 46 
 47                         foreach (dynamic picture in pictureResult.data)
 48                         {
 49                             if (!picture.name.EndsWith(".txt"))
 50                             {
 51                                 if (picture.name.Contains("Index_"))
 52                                 {
 53                                     group.SetImage(picture.source);
 54                                 }
 55                                 else
 56                                 {
 57                                     var pictureItem = new SampleDataItem(picture.id, picture.name, "", picture.source, picture.description, picture.description, group);
 58                                     group.Items.Add(pictureItem);
 59                                 }
 60                             }
 61                         }
 62 
 63                         foreach (dynamic picture in pictureResult.data)
 64                         {
 65                             if (picture.name.EndsWith(".txt"))
 66                             {
 67 
 68                                 string filename = picture.name.Split(new char[] { '.' })[0];
 69                                 StorageFile file = await DownLoadTxtFile(picture.id, picture.name);
 70                                 string description = await Windows.Storage.FileIO.ReadTextAsync(file);
 71                                 if (filename.Contains("Index_"))
 72                                 {
 73                                     group.Description = description;
 74                                 }
 75                                 else
 76                                 {
 77                                     var item = group.Items.First<SampleDataItem>(i => i.Title.Split(new char[] { '.' })[0] == filename);
 78                                     item.Description = item.Content = description;
 79                                 }
 80                             }
 81                         }
 82                         this.AllGroups.Add(group);
 83                     }
 84                 }
 85             }
 86         }
 87 
 88         /// <summary>
 89         /// Simply check whether file exists.
 90         /// </summary>
 91         /// <param name="fileName"></param>
 92         /// <returns></returns>
 93         async Task<bool> DoesFileExistAsync(string fileName)
 94         {
 95             try
 96             {
 97                 await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
 98                 return true;
 99             }
100             catch
101             {
102                 return false;
103             }
104         }
105 
106         /// <summary>
107         /// Download file if description file does not exist.
108         /// </summary>
109         /// <param name="fileid"></param>
110         /// <param name="filename"></param>
111         /// <returns></returns>
112         private async Task<StorageFile> DownLoadTxtFile(string fileid, string filename)
113         {
114             var fileExists = await DoesFileExistAsync(filename);
115             if (fileExists)
116             {
117                 return await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync(filename);
118             }
119             else
120             {
121                 StorageFile file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(filename);
122                 LiveConnectClient client = new LiveConnectClient(App.Session);
123                 await client.BackgroundDownloadAsync(fileid + "/content", file);
124                 return file;
125             }
126         }
127         #endregion

 

  本文部分内容BITED了解的也不是很深入。待进一步了解再给出更详细的经验解说。

  

  

Copyright ©2013 BITED.All rights reserved.

posted @ 2013-08-28 21:55  BITED  阅读(391)  评论(0编辑  收藏  举报