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

SimpleMVVMExample Demo下载

时间: 2024-10-09 20:29:32

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

MVVM开发模式简单实例MVVM Demo

本文主要是翻译Rachel Lim的一篇有关MVVM模式介绍的博文 A Simple MVVM Example 并具体给出了一个简单的Demo(原文是以WPF开发的,对于我自己添加的一部分会用红色标注) 现在开始: 在我看来,如果你使用的是WPF或Sliverlight来开发程序就应该使用MVVM设计模式.它是你的代码清晰明了并易于维护. 可问题是网上有很多有关MVVM模式的资源都有自己强大的实现方式.这里我将介绍最基础的MVVM设计模式的实现方法. MVVM  (是Model-View-Vie

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

理解javascript中的MVVM开发模式 http://blog.csdn.net/slalx/article/details/7856769 MVVM的全称是Model View ViewModel,这种架构模式最初是由微软的MartinFowler作为微软软件的展现层设计模式的规范提出,它是MVC模式的衍生物,MVVM模式的关注点在能够支持事件驱动的UI开发平台,例如HTML5,[2][3] WindowsPresentation Foundation (WPF), Silverligh

android MVVM开发模式(一)

android MVVM开发模式 概念 mvvm 是一个在 mvp 架构上修改,目标是将view的一些更改,跟model关联起来,使得model的数据改变,直接通知到view上面来,从而解决mvp架构里面的v-p之间的接口太重问题. 所以mvvm的核心解决问题为:使得v-p直接的关系弱化,使用绑定方式(dataBinding)直接将model的改变反馈到view上面. 关于完整的dataBinding讲解,请看这里 https://github.com/LyndonChin/MasteringA

转 。。理解javascript中的MVVM开发模式

MVVM的全称是Model View ViewModel,这种架构模式最初是由微软的MartinFowler作为微软软件的展现层设计模式的规范提出,它是MVC模式的衍生物,MVVM模式的关注点在能够支持事件驱动的UI开发平台,例如HTML5,[2][3] WindowsPresentation Foundation (WPF), Silverlight 和 t ZK framework,Adobe Flex. 对这种模式的实现,大部分都是通过在view层声明数据绑定来和其他层分离的,这样就方便了

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

Hibernate是非常典型的持久层框架,持久化的思想是非常值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和原理,到最后可能什么也学不会,从实践入手,熟能生巧,思想和原理自然而然领悟. 上篇博文:[SSH进阶之路]Hibernate基本原理,我们介绍了Hibernate的基本概念.Hibernate的核心以及Hibernate的执行原理,可以很好帮助我们认识Hibernate,再看这篇博客之前,请先回顾上

java 工厂方法模式简单实例

工厂方法模式:也叫工厂模式,属于类创建型模式,工厂父类(接口)负责定义产品对象的公共接口,而子类工厂则负责创建具体的产品对象. 目的:是为了把产品的实例化操作延迟到子类工厂中完成,通过工厂子类来决定究竟应该实例化哪一个产品具体对象. 工厂方法模式包含四个部分: 1.抽象产品:产品对象同一的基类,或者是同一的接口. 2.具体的产品:各个不同的实例对象类 3.抽象工厂:所有的子类工厂类的基类,或是同一的接口 4.具体的工厂子类:负责每个不同的产品对象的实际创建 具体的实例代码: 1.抽象的产品类:定

VS2008中C#开发webservice简单实例

1.创建工程 文件-> 新建->网站 如下图. 工程建好后,会自动添加如下代码: 1 using System; 2 using System.Linq; 3 using System.Web; 4 using System.Web.Services; 5 using System.Web.Services.Protocols; 6 using System.Xml.Linq; 7 8 [WebService(Namespace = "http://tempuri.org/"

MTV开发模式简单说明

Django的MTV模式本质上和MVC是一样,越是为了各组件件保持松耦合关系,只是定义上有些不同Django的MTV分别是:M代表模型(Model):负责业务对象和数据库的关系映射(ORM)T代表模块(Template):负责如何把页面展示给用户(html)V代表视图(View):负责业务逻辑,并在适合的时候调用Model和Template处理以上三层之外,还需要一个URL分发器,她它的作用是将一个个的URL页面请求分发给不同的Views处理,View再调用相应的Model和Template,M

不用IDE,进行struts2开发的简单实例

1.在tomcat的webapp中创建一个WEB工程myapp,具体的文件及路径如下所示: ①/webapp/myapp/login.jsp ②/webapp/myapp/welcom.jsp ③/webapp/myapp/error.jsp ④/webapp/myapp/WEB-INF/web.xml ⑤/webapp/myapp/WEB-INF/classes ⑥/webapp/myapp/WEB-INF/classes/struts.xml ⑦/webapp/myapp/WEB-INF/c