在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. 自定义获取焦点的TextView

    自定义控件编写流程 创建一个默认就能获取焦点的TextView 1.创建一个类继承至TextView,FocusTextView 2.重写其构造方法 //使用在通过java代码创建控件 public ...

  2. TortoiseSvn

    TortoiseSVN 是svn版本控制系统的一个免费开源客户端,它是svn版本控制的 Windows 扩展.可以使你避免使用枯燥而且不方便的命令行.它完全嵌入 Windows Explorer,使用 ...

  3. SVM(支持向量机)与统计机器学习 & 也说一下KNN算法

    因为SVM和统计机器学习内容很多,所以从 http://www.cnblogs.com/charlesblc/p/6188562.html 这篇文章里面分出来,单独写. 为什么说SVM和统计学关系很大 ...

  4. Java注解Annotation学习

    学习注解Annotation的原理,这篇讲的不错:http://blog.csdn.net/lylwo317/article/details/52163304 先自定义一个运行时注解 @Target( ...

  5. jquery select选中项 赋值

    $("flag").attr("value",flag); $("#flag").find("option:selected&qu ...

  6. hiho_1066_并查集

    题目大意 给出N个操作,每个操作可能为两种类型之一: 1. 认定两个人属于同一个组织 2. 查询两个人是否是同一个组织 要求对于每个操作类型2,给出结果,即查询的两个人是否属于同一个组织.其中,任何人 ...

  7. C# Web中Session的使用

    1. 关于使用之前要注意的: 在使用session之前,一定要注意继承自System.Web.UI.Page,或在使用session时加上System.Web.HttpContext.Current: ...

  8. MySQL高可用性分析

    版权声明:本文由易固武原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/203 来源:腾云阁 https://www.qclo ...

  9. ARPG游戏技能系统设计

    ARPG游戏的技能的前端表现, 主要指的是人物动作和特效表现, 从普遍意义上讲,大致可以分为三个阶段:起手.飞行.碰撞(爆炸). [特效可见性判断] 1.[attacker & victim] ...

  10. 华为面试题——约瑟夫问题的C++简单实现(循环链表)

    /*     author:jiangxin     Blog:http://blog.csdn.net/jiangxinnju     Function:method of Josephus que ...