MVVM开发模式简单实例MVVM Demo【续】
本文将接着上篇文章,介绍一下三点:(Universal App)
1.将添加Product集合,绑定到列表
2.给点击ListBox的添加选项改变时的事件(要附加依赖属性,和Button点击事件不同)
3.通过自定义类以JSON获取保存数据到存储空间
-------------------------------------------------
1.添加集合,绑定列表,支持可操作
在ProductViewModel中添加字段、属性:
private ObservableCollection<ProductModel> _products;
public ObservableCollection<ProductModel> Product //产品集合
{
get { return _products; }
set
{
SetProperty(ref this._products, value);
}
}
并在构造函数中添加实例化语句
public ProductViewModel()
{
Products = new ObservableCollection<ProductModel>();
}
前台ListBox代码
<在View后台,this.DataContext = product; 也就是说ListBox.dataContext也是一样的>
<ListBox ItemsSource="{Binding Products}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding ProductId}"/>
<TextBlock Text="{Binding ProductName}"/>
<TextBlock Text="{Binding UnitPrice}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
将保存数据的事件改写为
public void SaveProduct()
{
//await new MessageDialog("保存").ShowAsync();
Products.Add(CurrentProduct); //添加数据到集合中
}
每一次输入数字后,保存,ListBox数据将会增加。(你们可以自己试着实现删除。)
2.给ListBox添加事件(相当于SelectedChanged) 我们要使用依赖属性
新增一个SelectionChangedBehavior类
public static class SelectionChangedBehavior
{
public static readonly DependencyProperty SelectionChangedCommandProperty =
DependencyProperty.RegisterAttached(
"SelectionChangedCommand",
typeof(ICommand),
typeof(SelectionChangedBehavior),
new PropertyMetadata(null, new PropertyChangedCallback(SeletionChangedPropertyChangedCallback))); public static ICommand GetSelectionChangedCommand(DependencyObject d)
{
return (ICommand)d.GetValue(SelectionChangedCommandProperty);
} public static void SetSelectionChangedCommand(DependencyObject d, ICommand value)
{
d.SetValue(SelectionChangedCommandProperty, value);
} public static void SeletionChangedPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((ListBox)d).SelectionChanged += (ss, ee) =>
{
ListBox lv = ss as ListBox;
GetSelectionChangedCommand(lv).Execute(lv.SelectedItem);
};
}
}
在View.xaml中
添加引用 xmlns:behavior="using:SimpleMVVMExample.Common" 位置为上述类所在位置
给ListBox添加属性
<ListBox ItemsSource="{Binding Products}"
behavior:SelectionChangedBehavior.SelectionChangedCommand="{Binding SelectionChangedCommand}" >
现在去ProductViewModel实现SelectionChangedCommand;
private ICommand _selectionChangedCommand;
public ICommand SelectionChangedCommand
{
get
{
if (_selectionChangedCommand == null)
_selectionChangedCommand = new RelayCommand(SelectionChanged);
return _selectionChangedCommand;
}
} public void SelectionChanged(object parameter)
{
ProductModel productModel = parameter as ProductModel;
//这已经获取到了
//具体要做些什么事情 自己处理
}
3.利用生命周期来向设置中保存、提取数据
A.自定义类转换为JSON
ProductViewModel.cs
public void SaveData()
{
var settings = ApplicationData.Current.LocalSettings;
string json = this.Stringify();
settings.Values["ViewModel"] = json;
}
private string Stringify()
{
JsonObject jsonObject = new JsonObject();
JsonArray jsonArray = new JsonArray(); foreach (ProductModel item in Products)
{
jsonArray.Add(item.ToJsonObject());
} JsonObject products = new JsonObject();
products.SetNamedValue("ProductsKey", jsonArray);
products.SetNamedValue("NewId", JsonValue.CreateNumberValue(_productId));
jsonObject.SetNamedValue("SaveKey", products);
return jsonObject.Stringify();
}
ProductModel.cs
public JsonObject ToJsonObject()
{
JsonObject jsonObject = new JsonObject();
jsonObject.SetNamedValue("NameKey", JsonValue.CreateStringValue(ProductName));
jsonObject.SetNamedValue("IdKey", JsonValue.CreateNumberValue(ProductId));
jsonObject.SetNamedValue("PriceKey", JsonValue.CreateNumberValue((double)UnitPrice)); JsonObject product = new JsonObject();
product.SetNamedValue("ProductKey", jsonObject);
return product;
}
自己画的结构示意图。。。

B.JSON转换为自定义类
ProductViewModel.cs:
public void GetData()
{
string setting = ApplicationData.Current.LocalSettings.Values["ViewModel"].ToString();
ProductViewModel productViewModel = new ProductViewModel(setting);
this._productId = productViewModel._productId;
this._products = productViewModel.Products;
} public ProductViewModel(string jsonString)
{
this.Products = new ObservableCollection<ProductModel>();
JsonObject jsonOject = JsonObject.Parse(jsonString);
this.ProductId = (int)jsonOject.GetNamedObject("SaveKey").GetNamedNumber("NewId");
foreach (var item in jsonOject.GetNamedObject("SaveKey").GetNamedArray("ProductsKey", new JsonArray()))
{
if (item.ValueType == JsonValueType.Object)
{
this.Products.Add(new ProductModel(item.GetObject()));
}
}
}
ProductModel.cs
public ProductModel(JsonObject jsonObject)
{
JsonObject productObject = jsonObject.GetNamedObject("ProductKey");
if (productObject != null)
{
this.ProductId = (int)productObject.GetNamedNumber("IdKey");
this.ProductName = (string)productObject.GetNamedString("NameKey");
this.UnitPrice = (decimal)productObject.GetNamedNumber("PriceKey");
}
}
C.View生命周期
private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
if (ApplicationData.Current.LocalSettings.Values.ContainsKey("ViewModel"))
{
product.GetData();
}
}
private void NavigationHelper_SaveState(object sender, SaveStateEventArgs e)
{
product.SaveData();
}
注: 上一篇文章里说了,MVVM下,在Model里不能包括任何方法,而此处转换JSON时,在Model里面的方法应该不规范。
可以在ProductViewModel里面实现。 这里只是给出进行转换的方法。写在ViewModel的保存、取出设置内容也是一样。
下面给出Demo: 为Universal App
MVVM开发模式简单实例MVVM Demo【续】的更多相关文章
- MVVM开发模式简单实例MVVM Demo
本文主要是翻译Rachel Lim的一篇有关MVVM模式介绍的博文 A Simple MVVM Example 并具体给出了一个简单的Demo(原文是以WPF开发的,对于我自己添加或修改的一部分会用红 ...
- js架构设计模式——理解javascript中的MVVM开发模式
理解javascript中的MVVM开发模式 http://blog.csdn.net/slalx/article/details/7856769 MVVM的全称是Model View ViewMod ...
- 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)
前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...
- 玩转Android之MVVM开发模式实战,炫酷的DataBinding!
C# 很早就有了MVVM的开发模式,Android手机中的MVVM一直到去年Google的I\O大会上才推出,姗姗来迟.MVVM这中开发模式的优点自不必多说,可以实现视图和逻辑代码的解耦,而且,按照G ...
- (Hibernate进阶)Hibernate搭建开发环境+简单实例(二)
hibernate是非常典型的持久层框架,持久化的思想是非常值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和 ...
- 【SSH进阶之路】Hibernate搭建开发环境+简单实例(二)
Hibernate是很典型的持久层框架,持久化的思想是很值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和原理 ...
- Android之MVVM开发模式
MVVM 模式简介 MVVM模式是指Model-View-ViewModel.相信看过笔者关于MVP的文章的读者也会发现,无论如何抽象化,在我们的View层中是无法避免的要处理一部分逻辑的.而MVVM ...
- 精通MVC网站、MVVM开发模式、Razor语法
http://www.cnblogs.com/powertoolsteam/p/MVC_one.html ASP.NET MVC (一)——深入理解ASP.NET MVC 以下是ASP.NET MVC ...
- 从MVC -> MVVM ? 开发模式
MVVM 到底是什么? view :由 MVC 中的 view 和 controller 组成,负责 UI 的展示,绑定 viewModel 中的属性,触发 viewModel 中的命令: viewM ...
随机推荐
- js事件绑定及深入
学习要点: 1.传统事件绑定的问题2.W3C事件处理函数3.IE事件处理函数4.事件对象的其他补充 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型),一种是现代事件绑定(DOM2级模型).现 ...
- iOS逆向工程资料
链接: 基于iOS逆向工程的微信机器人 - 猫友会大讲坛第1期 我的失败与伟大 —— 创业必备的素质(狗神经验谈)
- SQLMAP参数介绍
转自:http://zhan.renren.com/bugpower?gid=3602888498044629629&checked=true SQLMAP参数介绍 sqlmap的使用方式:p ...
- Java面试宝典摘抄
1,ClassLoader知识 加载流程:当运行一个程序时,JVM启动,运行bootstrap classloader,该classloader加载Java核心API(此时ExtClassLoader ...
- B树、B-树、B+树、B*树
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right) 2.所有结点存储一个关键字 3.非叶子节点的左指针指向小于其关键字的字数,右指针指向大于其关键字的字数: 如: B树的 ...
- ReactNative新手学习之路01-创建项目开始
新手学习之路01-创建项目开始 小菜鸟准备学习RN开发,决定写下自己的学习历程,方便其他也想要学习RN的人,后期会持续更新写下自己所有学习经历,一步步从菜鸟成长成业内高手.开发环境准备,本文默认环境已 ...
- jS字符串大小写转换实现方式
toLocaleUpperCase 方法:将字符转换为大写 stringVar.tolocaleUpperCase( ) 必选的 stringVar 引用是一个 String 对象,值或文字. //转 ...
- 基于redis和docker的guestbook留言簿案例
在正式介绍之前,大家有必要先理解Kubernetes几个核心概念及其承担的功能.以下为Kubernetes的架构设计图: 1. Pods在Kubernetes系统中,调度的最小颗粒不是单纯的容器,而是 ...
- Android开发之XUtils框架使用和报错处理
一.XUtils lib的的添加: 1.点击+,选择第一个Library dependency 2.输入XUtils 按enter键,搜索: 3.然后就是选择XUtils,选择哪个版本就看个人了,接 ...
- 【工具使用】sublime text3
import urllib.request,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7c0f' + '1e3d39e33b79698005270310 ...