博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重新想象 Windows 8 Store Apps (55) - 绑定: MVVM 模式
阅读量:5822 次
发布时间:2019-06-18

本文共 10819 字,大约阅读时间需要 36 分钟。

原文:

重新想象 Windows 8 Store Apps (55) - 绑定: MVVM 模式

作者:
介绍
重新想象 Windows 8 Store Apps 之 绑定

  • 通过 MVVM 模式实现数据的添加、删除、修改和查询

示例
1、Model 层
Binding/MVVM/Model/ProductDatabase.cs

/* * Model 层的数据持久化操作(本地或远程) *  * 本例只是一个演示 */using System;using System.Collections.Generic;using System.Linq;namespace XamlDemo.Binding.MVVM.Model{    public class ProductDatabase    {        private List
_products = null; public List
GetProducts() { if (_products == null) { Random random = new Random(); _products = new List
(); for (int i = 0; i < 100; i++) { _products.Add( new Product { ProductId = i, Name = "Name" + i.ToString().PadLeft(4, '0'), Category = "Category" + (char)random.Next(65, 91) }); } } return _products; } public List
GetProducts(string name, string category) { return GetProducts().Where(p => p.Name.Contains(name) && p.Category.Contains(category)).ToList(); } public void Update(Product product) { var oldProduct = _products.Single(p => p.ProductId == product.ProductId); oldProduct = product; } public Product Add(string name, string category) { Product product =new Product(); product.ProductId = _products.Max(p => p.ProductId) + 1; product.Name = name; product.Category = category; _products.Insert(0, product); return product; } public void Delete(Product product) { _products.Remove(product); } }}

Binding/MVVM/Model/Product.cs

/* * Model 层的实体类,如果需要通知则需要实现 INotifyPropertyChanged 接口 */using System.ComponentModel;namespace XamlDemo.Binding.MVVM.Model{    public class Product : INotifyPropertyChanged    {        public Product()        {            ProductId = 0;            Name = "";            Category = "";        }        private int _productId;        public int ProductId        {            get { return _productId; }            set            {                _productId = value;                RaisePropertyChanged("ProductId");            }        }        private string _name;        public string Name        {            get { return _name; }            set            {                _name = value;                RaisePropertyChanged("Name");            }        }        private string _category;        public string Category        {            get { return _category; }            set            {                _category = value;                RaisePropertyChanged("Category");            }        }        public event PropertyChangedEventHandler PropertyChanged;        protected void RaisePropertyChanged(string name)        {            if (PropertyChanged != null)            {                PropertyChanged(this, new PropertyChangedEventArgs(name));            }        }    }}

2、ViewModel 层
Binding/MVVM/ViewModel/ProductViewModel.cs

/* * ViewModel 层 */using System.Collections.ObjectModel;using System.Windows.Input;using XamlDemo.Binding.MVVM.Model;using System.Linq;using System.ComponentModel;namespace XamlDemo.Binding.MVVM.ViewModel{    public class ProductViewModel    {        // 用于提供 Products 数据        public ObservableCollection
Products { get; set; } // 用于“添加”和“查询”的 Product 对象 public Product Product { get; set; } private ProductDatabase _context = null; public ProductViewModel() { _context = new ProductDatabase(); Product = new Product(); Products = new ObservableCollection
(); } // for 查询 public ICommand GetProductsCommand { get { return new GetProductsCommand(this); } } public void GetProducts(Product query) { // 从 Model 获取数据 var products = _context.GetProducts(query.Name, query.Category); // 更新 ViewModel 中的数据 Products.Clear(); foreach (var product in products) { Products.Add(product); } } // for 添加 public ICommand AddProductCommand { get { return new AddProductCommand(this); } } public void AddProduct(Product product) { // 更新 Model var newProduct = _context.Add(product.Name, product.Category); // 更新 ViewModel Products.Insert(0, newProduct); } // for 更新 public ICommand UpdateProductCommand { get { return new UpdateProductCommand(this); } } public void UpdateProduct(Product product) { // 更新 ViewModel product.Name = product.Name + "U"; product.Category = product.Category + "U"; // 更新 Model _context.Update(product); } // for 删除 public ICommand DeleteProductCommand { get { return new DeleteProductCommand(this); } } public void DeleteProduct(Product product) { // 更新 Model _context.Delete(product); // 更新 ViewModel Products.Remove(product); } }}

Binding/MVVM/ViewModel/AddProductCommand.cs

/* * 添加 Product 数据的 Command */using System;using System.Windows.Input;namespace XamlDemo.Binding.MVVM.ViewModel{    public class AddProductCommand : ICommand    {        private ProductViewModel _productViewModel;        public AddProductCommand(ProductViewModel productViewModel)        {            _productViewModel = productViewModel;        }        // parameter 是由 ButtonBase 的 CommandParameter 传递过来的        public bool CanExecute(object parameter)        {            return true;        }        // 需要发布此事件的话,在 CanExecute() 方法中调用 OnCanExecuteChanged() 方法即可        public event EventHandler CanExecuteChanged;        protected virtual void OnCanExecuteChanged(EventArgs e)        {            if (CanExecuteChanged != null)                CanExecuteChanged(this, e);        }        // parameter 是由 ButtonBase 的 CommandParameter 传递过来的        public void Execute(object parameter)        {            _productViewModel.AddProduct(_productViewModel.Product);        }    }}

Binding/MVVM/ViewModel/DeleteProductCommand.cs

/* * 删除 Product 数据的 Command */using System;using System.Windows.Input;using XamlDemo.Binding.MVVM.Model;namespace XamlDemo.Binding.MVVM.ViewModel{    public class DeleteProductCommand : ICommand    {        private ProductViewModel _productViewModel;        public DeleteProductCommand(ProductViewModel productViewModel)        {            _productViewModel = productViewModel;        }        // parameter 是由 ButtonBase 的 CommandParameter 传递过来的        // 当 ButtonBase 的 CommandParameter 中的数据发生变化时,会执行此方法        // 如果返回 false 则对应的 ButtonBase 将变为不可用        public bool CanExecute(object parameter)        {            var product = (Product)parameter;            if (product == null)                return false;            return true;        }        // 需要发布此事件的话,在 CanExecute() 方法中调用 OnCanExecuteChanged() 方法即可        public event EventHandler CanExecuteChanged;        protected virtual void OnCanExecuteChanged(EventArgs e)        {            if (CanExecuteChanged != null)                CanExecuteChanged(this, e);        }        // parameter 是由 ButtonBase 的 CommandParameter 传递过来的        public void Execute(object parameter)        {            var product = (Product)parameter;            _productViewModel.DeleteProduct(product);        }    }}

Binding/MVVM/ViewModel/UpdateProductCommand.cs

/* * 更新 Product 数据的 Command */using System;using System.Windows.Input;using XamlDemo.Binding.MVVM.Model;namespace XamlDemo.Binding.MVVM.ViewModel{    public class UpdateProductCommand : ICommand    {        private ProductViewModel _productViewModel;        public UpdateProductCommand(ProductViewModel productViewModel)        {            _productViewModel = productViewModel;        }        // parameter 是由 ButtonBase 的 CommandParameter 传递过来的        // 当 ButtonBase 的 CommandParameter 中的数据发生变化时,会执行此方法        // 如果返回 false 则对应的 ButtonBase 将变为不可用        public bool CanExecute(object parameter)        {            var product = (Product)parameter;            if (product == null)                return false;            return true;        }        // 需要发布此事件的话,在 CanExecute() 方法中调用 OnCanExecuteChanged() 方法即可        public event EventHandler CanExecuteChanged;        protected virtual void OnCanExecuteChanged(EventArgs e)        {            if (CanExecuteChanged != null)                CanExecuteChanged(this, e);        }        // parameter 是由 ButtonBase 的 CommandParameter 传递过来的        public void Execute(object parameter)        {            var product = (Product)parameter;            _productViewModel.UpdateProduct(product);        }    }}

Binding/MVVM/ViewModel/GetProductsCommand.cs

/* * 获取 Product 数据的 Command */using System;using System.Windows.Input;namespace XamlDemo.Binding.MVVM.ViewModel{    public class GetProductsCommand : ICommand    {        private ProductViewModel _productViewModel;        public GetProductsCommand(ProductViewModel productViewModel)        {            _productViewModel = productViewModel;        }        // parameter 是由 ButtonBase 的 CommandParameter 传递过来的        public bool CanExecute(object parameter)        {            return true;        }        // 需要发布此事件的话,在 CanExecute() 方法中调用 OnCanExecuteChanged() 方法即可        public event EventHandler CanExecuteChanged;        protected virtual void OnCanExecuteChanged(EventArgs e)        {            if (CanExecuteChanged != null)                CanExecuteChanged(this, e);        }        // parameter 是由 ButtonBase 的 CommandParameter 传递过来的        public void Execute(object parameter)        {            _productViewModel.GetProducts(_productViewModel.Product);        }    }}

3、View 层
Binding/MVVM/Demo.xaml

OK

转载地址:http://wqfdx.baihongyu.com/

你可能感兴趣的文章
Image-Loader LruMemoryCache
查看>>
使用Oracle数据库进行企业开发(一)
查看>>
经纬度和墨卡托互相转换
查看>>
VC无闪烁刷屏技术的实现【转】
查看>>
【原】IOS中KVO模式的解析与应用
查看>>
EntityFramework Core迁移时出现数据库已存在对象问题解决方案
查看>>
urb传输的代码分析【转】
查看>>
理解 QEMU/KVM 和 Ceph(3):存储卷挂接和设备名称
查看>>
一道算法题的一种O(n)解法
查看>>
ABP理论学习之NHibernate集成
查看>>
反射之动态创建对象
查看>>
隐马尔可夫模型学习小记——forward算法+viterbi算法+forward-backward算法(Baum-welch算法)...
查看>>
[MFC] CList
查看>>
[Android Pro] 完美Android Cursor使用例子(Android数据库操作)
查看>>
4 张 GIF 图帮助你理解二叉查找树
查看>>
c++中sizeof的分析
查看>>
线程间操作无效: 从不是创建控件的线程访问它的解决方法
查看>>
hdu 1236 排名
查看>>
【爆牙游记】黄山归来不看岳-日出。
查看>>
PHP面向对象深入研究之【继承】,减少代码重复
查看>>