在Data.cs

  1. namespace PicApp
  2. {
  3. [DataContract]
  4. class DataItem : PropertyChangeNotification
  5. {
  6. public event PropertyChangedEventHandler PropertyChanged;
  7.  
  8. [DataMember]
  9. public int Id
  10. {
  11. get
  12. {
  13. return (this.id);
  14. }
  15. set
  16. {
  17. base.SetProperty(ref this.id, value);
  18. }
  19. }
  20. [DataMember]
  21. public Uri ImageUri
  22. {
  23. get
  24. {
  25. return (this.imageUri);
  26. }
  27. set
  28. {
  29. base.SetProperty(ref this.imageUri, value);
  30. }
  31. }
  32. [DataMember]
  33. public string Title
  34. {
  35. get
  36. {
  37. return (this.title);
  38. }
  39. set
  40. {
  41. base.SetProperty(ref this.title, value);
  42. }
  43. }
  44. int id;
  45. Uri imageUri;
  46. string title;
  47. }
  48. // trying to keep this as simple, static and out of the way as possible.
  49. static class Data
  50. {
  51. static List<DataItem> dataItems;
  52.  
  53. public static async Task<IList<DataItem>> GetItemsAsync()
  54. {
  55. if (dataItems == null)
  56. {
  57. var localFolder = ApplicationData.Current.LocalFolder;
  58.  
  59. try
  60. {
  61. var file = await localFolder.GetFileAsync(FILENAME);
  62.  
  63. using (Stream netStream = await file.OpenStreamForReadAsync())
  64. {
  65. DataContractSerializer serializer = new DataContractSerializer(typeof(List<DataItem>));
  66. dataItems = (List<DataItem>)serializer.ReadObject(netStream);
  67. }
  68. }
  69. catch (FileNotFoundException)
  70. {
  71. }
  72. if (dataItems == null)
  73. {
  74. dataItems = await BuildDataFromPackageAsync();
  75. }
  76. }
  77. return (dataItems);
  78. }
  79. public static async Task SaveItemsAsync()
  80. {
  81. if (dataItems != null)
  82. {
  83. var localFolder = ApplicationData.Current.LocalFolder;
  84. var file = await localFolder.CreateFileAsync(FILENAME, CreationCollisionOption.ReplaceExisting);
  85. using (Stream netStream = await file.OpenStreamForWriteAsync())
  86. {
  87. DataContractSerializer serializer = new DataContractSerializer(typeof(List<DataItem>));
  88. serializer.WriteObject(netStream, dataItems);
  89. }
  90. }
  91. }
  92. static async Task<List<DataItem>> BuildDataFromPackageAsync()
  93. {
  94. var folder = await Package.Current.InstalledLocation.GetFolderAsync("Images");
  95. var files = await folder.GetFilesAsync();
  96. return (files.Select(
  97. (f,i) => new DataItem()
  98. {
  99. Id = i,
  100. ImageUri = new Uri(string.Format(URI_BASE_FORMAT_STRING, f.Name)),
  101. Title = f.Name
  102. }).ToList());
  103. }
  104. static readonly string URI_BASE_FORMAT_STRING = "ms-appx:///Images/{0}";
  105. static readonly string FILENAME = "pictures.xml";
  106. }
  107. }

在ViewModel.cs

  1. namespace PicApp
  2. {
  3. class ViewModel : PropertyChangeNotification
  4. {
  5. public ViewModel()
  6. {
  7. this.isReadVisible = true;
  8. }
  9. public DataItem DataItem
  10. {
  11. get
  12. {
  13. return (this.dataItem);
  14. }
  15. set
  16. {
  17. base.SetProperty(ref this.dataItem, value);
  18. this.titleCopy = this.dataItem.Title;
  19. }
  20. }
  21. public void ConfirmTitleChanges()
  22. {
  23. this.titleCopy = this.dataItem.Title;
  24. }
  25. public void RevertTitleChanges()
  26. {
  27. this.dataItem.Title = this.titleCopy;
  28. }
  29. public void SetReadMode()
  30. {
  31. this.isReadVisible = true;
  32. this.RaiseVisibilityChanges();
  33. }
  34. public void SetEditMode()
  35. {
  36. this.isReadVisible = false;
  37. this.RaiseVisibilityChanges();
  38. }
  39. void RaiseVisibilityChanges()
  40. {
  41. base.OnPropertyChanged("IsReadVisible");
  42. base.OnPropertyChanged("IsEditVisible");
  43. }
  44. public Visibility IsReadVisible
  45. {
  46. get
  47. {
  48. return (BoolToVisibility(this.isReadVisible));
  49. }
  50. }
  51. public Visibility IsEditVisible
  52. {
  53. get
  54. {
  55. return (BoolToVisibility(!this.isReadVisible));
  56. }
  57. }
  58. public bool IsEditing
  59. {
  60. get
  61. {
  62. return (!this.isReadVisible);
  63. }
  64. }
  65. static Visibility BoolToVisibility(bool value)
  66. {
  67. return (value ? Visibility.Visible : Visibility.Collapsed);
  68. }
  69. string titleCopy;
  70. DataItem dataItem;
  71. bool isReadVisible;
  72. }
  73. }

wp8.1 C#技巧: Data和ViewModel类编写的更多相关文章

  1. WP8.1 Study5:Data binding数据绑定

    一.数据绑定 最简单的编程UI控件的方法是写自己的数据来获取和设置控件的属性,e.g. , textBox1.Text = "Hello, world"; 但在复杂的应用程序,这样 ...

  2. 设计模式之美:Private Class Data(私有类数据)

    索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):实现对初始化数据的封装. 意图 封装类的初始化数据,控制对类的属性的更改,并保持类数据与使用数据的方法间的隔离. Encapsulate ...

  3. C# 利用MS的 EntLib的Database类编写的DbHelper

    C# 利用MS的 EntLib的Database类编写的DbHelper,由于MS的EntLib对Oracle.SQL Server和MySql已经封装,所以可以该DbHelper可以适用这三种数据库 ...

  4. IntelliJ IDEA 2017版 SpringBoot测试类编写

    SpringBoot的测试类编写Demo 源码见 https://github.com/liushaoye/baseone.git

  5. [深入浅出WP8.1(Runtime)]网络编程之HttpClient类

    12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...

  6. WP8解析JSON格式(使用DataContractJsonSerializer类)(推荐)

    DataContractJsonSerializer是.NET自带的类,在解析JSON格式的时候使用起来方便快捷,至于生成方面由于暂时没用到就没去看了.使用需要引用System.Runtime.Ser ...

  7. .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库

    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...

  8. wp8.1 C#技巧: 计时器

    public MainPage() { this.InitializeComponent(); this.timer = new DispatcherTimer();//新建委托时间实例 timer. ...

  9. Zabbix实战-简易教程--技巧一(操作类技巧)

    一.常用操作技巧 1.克隆 监控项.模板.触发器都可以进行克隆.其中,模板克隆又分为克隆和完全克隆.完全克隆会将LLD也一起复制一份,就是和之前的模板一模一样,而模板的克隆只是克隆监控项,不复制低层次 ...

随机推荐

  1. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

  2. Hbase之批量删除数据

    import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; impo ...

  3. graph-tool文档(一)- 快速开始使用Graph-tool - 1.创建和操纵图

    目录: 快速开始使用graph-tool 创建和操纵图 -- 遍历顶点和边 ----- 遍历所有顶点或边 ----- 遍历一个顶点的neighbourhood 名词解释: instante:实例 di ...

  4. 【转】Android设置虚线、圆角、渐变

      Android虚线圆角渐变 有图又真相,先上图再说. 点击效果: 设置虚线: <?xml version="1.0" encoding="utf-8" ...

  5. 浅谈线程池(中):独立线程池的作用及IO线程池

    原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...

  6. js中event.target,this

    event.target这是注册事件时的对象,或者它的子元素.通常用于比较 event.target 和 this 来确定事件是不是由于冒泡而触发的.经常用于事件冒泡时处理事件委托. 1.this和e ...

  7. [saiku] 集成单点登录

    思路: 自定义一个loginCallbackFilter用于单点登录成功后执行模拟用户认证授权登录的操作. 当授权成功后所有配置需要授权才能访问的url就再也不会被任何filter拦截,可随意访问了. ...

  8. VS2012外接程序VMDebugger未能加载或导致了异常

    转http://blog.csdn.net/maryhuan/article/details/42676915 故障现象:打开Visual Studio 2010后弹出错误框,外接程序VMDebugg ...

  9. MySQL 存储php中json_encode格式中文问题及解决

    MySQL 存储php中json_encode格式信息  ,遇到中文时, 会变成一堆类似uxxxx信息. 1. 原因分析:在存储到数据库时!MySQL 不会存储 unicode 字符: MySQL 仅 ...

  10. hdu 3172 Virtual Friends (映射并查集)

    Virtual Friends Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...