本文将接着上篇文章,介绍一下三点:(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

SimpleMVVMExample Demo下载

MVVM开发模式简单实例MVVM Demo【续】的更多相关文章

  1. MVVM开发模式简单实例MVVM Demo

    本文主要是翻译Rachel Lim的一篇有关MVVM模式介绍的博文 A Simple MVVM Example 并具体给出了一个简单的Demo(原文是以WPF开发的,对于我自己添加或修改的一部分会用红 ...

  2. js架构设计模式——理解javascript中的MVVM开发模式

    理解javascript中的MVVM开发模式 http://blog.csdn.net/slalx/article/details/7856769 MVVM的全称是Model View ViewMod ...

  3. 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)

    前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...

  4. 玩转Android之MVVM开发模式实战,炫酷的DataBinding!

    C# 很早就有了MVVM的开发模式,Android手机中的MVVM一直到去年Google的I\O大会上才推出,姗姗来迟.MVVM这中开发模式的优点自不必多说,可以实现视图和逻辑代码的解耦,而且,按照G ...

  5. (Hibernate进阶)Hibernate搭建开发环境+简单实例(二)

    hibernate是非常典型的持久层框架,持久化的思想是非常值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和 ...

  6. 【SSH进阶之路】Hibernate搭建开发环境+简单实例(二)

    Hibernate是很典型的持久层框架,持久化的思想是很值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和原理 ...

  7. Android之MVVM开发模式

    MVVM 模式简介 MVVM模式是指Model-View-ViewModel.相信看过笔者关于MVP的文章的读者也会发现,无论如何抽象化,在我们的View层中是无法避免的要处理一部分逻辑的.而MVVM ...

  8. 精通MVC网站、MVVM开发模式、Razor语法

    http://www.cnblogs.com/powertoolsteam/p/MVC_one.html ASP.NET MVC (一)——深入理解ASP.NET MVC 以下是ASP.NET MVC ...

  9. 从MVC -> MVVM ? 开发模式

    MVVM 到底是什么? view :由 MVC 中的 view 和 controller 组成,负责 UI 的展示,绑定 viewModel 中的属性,触发 viewModel 中的命令: viewM ...

随机推荐

  1. JustWe-WebServer Android上的Http服务器

    JustWe-WebServer Android手机上的Http服务器,可以用于内网/外网的数据交换. ps: 这个项目是JustWeEngine游戏框架中处理网络事件的一部分. 如何使用 设置as ...

  2. 【2016-11-1】【坚持学习】【Day16】【MongoDB】【复制集 分片】

    Mongodb 两种集群方式 复制集 通常是一主一从,一主多从 mongodb的复制至少需要两个节点.其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据. mongodb各 ...

  3. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  4. AR For Unity3D之HiAR分析

     前言 关于AR和Unity的基础知识,请自行前往各自的文档中心进行科普. 本文以国产的HiAR SDK为例,日后将尝试高通的vuforia SDK  我的环境 基于Hi AR1.2.0 ( hiar ...

  5. Apache 配置虚拟主机三种方式

    一.基于IP 1. 假设服务器有个IP地址为192.168.1.10,使用ifconfig在同一个网络接口eth0上绑定3个IP: [root@localhost root]# ifconfig et ...

  6. AndroidStudio导入Eclipse的代码格式化文件

    对于一个团队来说,使用统一的代码格式是非常重要的,否则在使用版本控制工具时,会出现大量的冲突.在Eclipse里,我们可以通过一些xml来进行代码格式的统一,但是这些文件要应用在AndroidStud ...

  7. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  8. HTML页面和JSP页面禁止缓存

    一.JSP页面禁止缓存: 防止浏览器缓存当前访问的JSP动态页面,可以采用如下的方式进行设置,此效果如下的“HTML禁止缓存”: % 将过期日期设置为一个过去时间response.setHeader( ...

  9. 用CSS正确显示人民币符号的HTML转义字符

    做电子商务的难免要跟钱打交道,特别是跟人民币接触更多,但人民币符号长什么样呢,是¥还是¥?糊涂了吧^~^,要知道答案很简单,找出一张新的一百元大钞,在背面看看那个防伪的银线,上面就有. 我们做网页时要 ...

  10. 20145208《信息安全系统设计基础》实验五 简单嵌入式WEB 服务器实验

    20145208<信息安全系统设计基础>实验五 简单嵌入式WEB 服务器实验 20145208<信息安全系统设计基础>实验五 简单嵌入式WEB 服务器实验