wp8.1 C#技巧: Data和ViewModel类编写
在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类编写的更多相关文章
- WP8.1 Study5:Data binding数据绑定
一.数据绑定 最简单的编程UI控件的方法是写自己的数据来获取和设置控件的属性,e.g. , textBox1.Text = "Hello, world"; 但在复杂的应用程序,这样 ...
- 设计模式之美:Private Class Data(私有类数据)
索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):实现对初始化数据的封装. 意图 封装类的初始化数据,控制对类的属性的更改,并保持类数据与使用数据的方法间的隔离. Encapsulate ...
- C# 利用MS的 EntLib的Database类编写的DbHelper
C# 利用MS的 EntLib的Database类编写的DbHelper,由于MS的EntLib对Oracle.SQL Server和MySql已经封装,所以可以该DbHelper可以适用这三种数据库 ...
- IntelliJ IDEA 2017版 SpringBoot测试类编写
SpringBoot的测试类编写Demo 源码见 https://github.com/liushaoye/baseone.git
- [深入浅出WP8.1(Runtime)]网络编程之HttpClient类
12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...
- WP8解析JSON格式(使用DataContractJsonSerializer类)(推荐)
DataContractJsonSerializer是.NET自带的类,在解析JSON格式的时候使用起来方便快捷,至于生成方面由于暂时没用到就没去看了.使用需要引用System.Runtime.Ser ...
- .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库
批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...
- wp8.1 C#技巧: 计时器
public MainPage() { this.InitializeComponent(); this.timer = new DispatcherTimer();//新建委托时间实例 timer. ...
- Zabbix实战-简易教程--技巧一(操作类技巧)
一.常用操作技巧 1.克隆 监控项.模板.触发器都可以进行克隆.其中,模板克隆又分为克隆和完全克隆.完全克隆会将LLD也一起复制一份,就是和之前的模板一模一样,而模板的克隆只是克隆监控项,不复制低层次 ...
随机推荐
- C++——代码重用
一.包含对象成员的类 接口和实现:使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现).获得接口是is-a关系的组成部分.而使用组合,类可以获得实现,但不能获得接口.不 ...
- nginx日志文件切割
#!/bin/bash #脚本对日志文件进行切割 #脚本需要crontab 每天定时执行 #Nginx 日志文件的存放路径 logs_path="/../logs/" mkdir ...
- winScp 跳板机到服务器
http://jingyan.baidu.com/article/454316ab6ffe1af7a7c03a31.html?qq-pf-to=pcqq.group
- Android Studio新建Jni工程
2.2版本的Android Studio支持新建Jni工程,不用再像以前自己构建工程目录,首先把自己的升级自己的AS到2.2以上 然后打开Tools->Andorid->SDK manag ...
- php中的 == 和 ===
== 是等值 1 和 ‘1’ 是相等的 === 要等值并且类型相等,比如 1 和 ‘1’ 是不相等的,只有 ‘1’ 和 ‘1’ 是相等的.哈哈哈. http://ihacklog.com/post ...
- 如何使用 declare-styleable
如何使用 declare-styleable 在创建 xml 到 objectName/res/values/ 命名为 attrs.xml 编辑文件内容为(示例)<?xml version=&q ...
- Nodejs 配置+基础
Nodejs + NPP 配置. http://blog.csdn.net/foruok/article/details/48366765 NPM的全称是Node Package Manager,它就 ...
- 串行通讯之.NET SerialPort
第1章串行通讯之.NET SerialPort 2 1 枚举串口 2 2 打开/关闭串口 2 3 写数据 3 3.1 写二进制数据 3 3.2 写文本数据 4 4 ...
- android内存耗用:VSS/RSS/PSS/USS
VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) 不是真实当前应用进程所占用的内存. 内存分配的原理 从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完 ...
- linux笔记:链接命令,软链接和硬链接
命令名称:ln功能:生成链接文件命令所在目录:/bin/ln用法:ln [-s] 原文件 目标文件参数:-s 创建软链接(不写此参数则生成硬链接) 软链接:类似windows中的快捷方式.它只是一个链 ...