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也一起复制一份,就是和之前的模板一模一样,而模板的克隆只是克隆监控项,不复制低层次 ...
随机推荐
- android studio导入 so ,jar 文件。
环境为: Android Studio 1.0.2 如果是jar文件的话,请直接拷贝jar文件到项目的libs文件夹下,然后运行:Sync Project with Gradle Files.如下图2 ...
- 转:The Knuth-Morris-Pratt Algorithm in my own words
The Knuth-Morris-Pratt Algorithm in my own words For the past few days, I’ve been reading various ex ...
- extern 关键字
1 http://baike.baidu.com/view/963932.htm?fr=ala0_1_1 extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和 ...
- 注意64位整形,int64,long long
在Xplorer中编译运行: int64_t mask = 0xffffffffffffffffLL; if((j+64)>width) { printf("%x %d " ...
- Hbase之取出行数据指定部分(类似MySQL的Limit)
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.CellScanner; import org. ...
- 树 - 从零开始实现by C++
参考链接:数据结构探险之树篇
- 在AngularJS应用中实现认证授权
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAokAAAFwCAIAAABbwHY6AAAgAElEQVR4nOy9+XtcxbX3+/4H9z73jP ...
- WANL标准组织介绍-02
无线电管理委员会 FCC ETSI IEEE Wi-Fi IETF WAPI 国家无线电管理委员会认证 国家无线电管理委员会认证(State Radio Regulatory Commission o ...
- [sso] 单点登录认证流程
一.流程说明 第一步:访问cas过滤链接ssoLogin,拼凑定向到 CAS_SERVER 获取ticket的URL 第二步:CAS_SERVER校验用户信息,生成Ticket 第三步:重新定向到访问 ...
- Shell基础:变量类型 & 运算符
Shell变量 Shell支持三种类型的变量 用户自定义变量:用户自定义的变量,变量名以英文字母或下划线开头,区分大小写. 位置变量:根据位置传递参数给脚本的变量,默认支持9个位置变量 $1,$2,$ ...