在Data.cs

namespace PicApp
{
[DataContract]
class DataItem : PropertyChangeNotification
{
public event PropertyChangedEventHandler PropertyChanged; [DataMember]
public int Id
{
get
{
return (this.id);
}
set
{
base.SetProperty(ref this.id, value);
}
}
[DataMember]
public Uri ImageUri
{
get
{
return (this.imageUri);
}
set
{
base.SetProperty(ref this.imageUri, value);
}
}
[DataMember]
public string Title
{
get
{
return (this.title);
}
set
{
base.SetProperty(ref this.title, value);
}
}
int id;
Uri imageUri;
string title;
}
// trying to keep this as simple, static and out of the way as possible.
static class Data
{
static List<DataItem> dataItems; public static async Task<IList<DataItem>> GetItemsAsync()
{
if (dataItems == null)
{
var localFolder = ApplicationData.Current.LocalFolder; try
{
var file = await localFolder.GetFileAsync(FILENAME); using (Stream netStream = await file.OpenStreamForReadAsync())
{
DataContractSerializer serializer = new DataContractSerializer(typeof(List<DataItem>));
dataItems = (List<DataItem>)serializer.ReadObject(netStream);
}
}
catch (FileNotFoundException)
{
}
if (dataItems == null)
{
dataItems = await BuildDataFromPackageAsync();
}
}
return (dataItems);
}
public static async Task SaveItemsAsync()
{
if (dataItems != null)
{
var localFolder = ApplicationData.Current.LocalFolder;
var file = await localFolder.CreateFileAsync(FILENAME, CreationCollisionOption.ReplaceExisting);
using (Stream netStream = await file.OpenStreamForWriteAsync())
{
DataContractSerializer serializer = new DataContractSerializer(typeof(List<DataItem>));
serializer.WriteObject(netStream, dataItems);
}
}
}
static async Task<List<DataItem>> BuildDataFromPackageAsync()
{
var folder = await Package.Current.InstalledLocation.GetFolderAsync("Images");
var files = await folder.GetFilesAsync();
return (files.Select(
(f,i) => new DataItem()
{
Id = i,
ImageUri = new Uri(string.Format(URI_BASE_FORMAT_STRING, f.Name)),
Title = f.Name
}).ToList());
}
static readonly string URI_BASE_FORMAT_STRING = "ms-appx:///Images/{0}";
static readonly string FILENAME = "pictures.xml";
}
}

在ViewModel.cs

namespace PicApp
{
class ViewModel : PropertyChangeNotification
{
public ViewModel()
{
this.isReadVisible = true;
}
public DataItem DataItem
{
get
{
return (this.dataItem);
}
set
{
base.SetProperty(ref this.dataItem, value);
this.titleCopy = this.dataItem.Title;
}
}
public void ConfirmTitleChanges()
{
this.titleCopy = this.dataItem.Title;
}
public void RevertTitleChanges()
{
this.dataItem.Title = this.titleCopy;
}
public void SetReadMode()
{
this.isReadVisible = true;
this.RaiseVisibilityChanges();
}
public void SetEditMode()
{
this.isReadVisible = false;
this.RaiseVisibilityChanges();
}
void RaiseVisibilityChanges()
{
base.OnPropertyChanged("IsReadVisible");
base.OnPropertyChanged("IsEditVisible");
}
public Visibility IsReadVisible
{
get
{
return (BoolToVisibility(this.isReadVisible));
}
}
public Visibility IsEditVisible
{
get
{
return (BoolToVisibility(!this.isReadVisible));
}
}
public bool IsEditing
{
get
{
return (!this.isReadVisible);
}
}
static Visibility BoolToVisibility(bool value)
{
return (value ? Visibility.Visible : Visibility.Collapsed);
}
string titleCopy;
DataItem dataItem;
bool isReadVisible;
}
}

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. android 主线程和子线程之间的消息传递

    从主线程发送消息到子线程(准确地说应该是非UI线程)  package com.zhuozhuo; import android.app.Activity; import android.os.Bun ...

  2. 设置TextView下划线并响应点击事件(SpannableString)

    下面是一个20行的完整Demo代码:基本原理是使用一个SpannableString并设置其ClickableSpan来响应点击事件. TextView useInfo = (TextView) fi ...

  3. CSS重置代码和常用公共代码

    发的发生的发生法士大夫撒打发士大夫

  4. JQuery基础汇总

    1. 对象获取与赋值::$("#obj").val("Hello World!"); 2. 对象的显示与隐藏:$("#obj").show( ...

  5. listToString

    http://www.oschina.net/code/snippet_109648_2229

  6. 图片(img标签)的onerror事件

    打开网页时提示 Stack overflow at line: 0.我做了截图如下: 经过分析,发现网页中存在类似如下的代码: <img src="pic.gif" oner ...

  7. JVM调优总结(转)

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  8. 我常用的Webstorm快捷键

    ctrl+b 跳转到方法内部 meta:vp + tab 生成移动端 ctrl + alt + l 整理代码 ctrl + shift + up/down 行移动 ctrl + shift + ent ...

  9. css禁止用户选中文本(转)

    body{ -moz-user-select:none;/*火狐*/ -webkit-user-select:none;/*webkit浏览器*/ -ms-user-select:none;/*IE1 ...

  10. selenium+python笔记11

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ @desc: search in mail box "&qu ...