ReoGrid.Mvvm:ReoGrid绑定模型
ReoGrid 是 C# 编写的.NET 电子表格控件(类似 Excel)。支持单元格合并,边框样式,图案背景颜色,数据格式,冻结,公式,宏和脚本执行,表格事件等。支持 Winform\WPF。
ReoGrid.Mvvm 是针对 ReoGrid.WPF 编写的一个开源类库,用于方便地将控件绑定到模型,从而实现模型(Model)和视图(View)的分离,适用于MVVM模式的开发。
项目地址:https://github.com/IUpdatable/ReoGrid.Mvvm,欢迎star
下面以一个图书信息的简单项目演示如何使用 ReoGrid.Mvvm
. 完整代码见项目 ReoGrid.Mvvm.Demo
.
演示效果如图
1. 创建一个 WPF 项目
2. NuGet 安装 ReoGrid.Mvvm
Install-Package ReoGrid.Mvvm
3. 创建一个图书的模型(Model)
[WorksheetAttribute(Title = "Books")]
public class Book: IRecordModel
{
[ColumnHeader(Index = , IsVisible = false)]
public int Id { get; set; } [ColumnHeader(Index = , Text = "Name", Width = )]
public string Title { get; set; } [ColumnHeader(Index = )]
public string Author { get; set; } [ColumnHeader(Index = , Text = "Type")]
public BindingType BindingType { get; set; } [ColumnHeader(Index = , Text = "OnSale")]
public bool IsOnSale { get; set; } [NumberFormat(DecimalPlaces = )]
[ColumnHeader(Index = )]
public decimal Price { get; set; } [DateTimeFormat( CultureName = "en-US")]
[ColumnHeader(Index = , Text = "Publish Date", Width = )]
public DateTime Pubdate { get; set; } public int RowIndex { get; set; }
}
(1) Model 必须实现IRecordModel
接口
IRecordModel
只有一个 RowIndex
属性, 你完全不用管这个属性,这是 ReoGrid.Mvvm
内部用到的。
(2) WorksheetAttribute
用来说明工作表的名字
可选,不指定该特性,那么就用Model类的类名作为工作表名称。
(3) ColumnHeader
特性中, 必须指定 Index
属性,其他的是可选的。
(4) DateTimeFormat
DateTimeFormat
目前不建议使用
ReoGrid
本身并没有完整实现这些特性。当然,也有可能我理解有误。
4. 在ViewModel中修改:
4.1 创建两个成员变量
private ObservableCollection<IRecordModel> _Books;
private WorksheetModel _WorksheetModel;
4.2 初始化
_Books = new ObservableCollection<IRecordModel>();
for (int i = ; i < ; i++)
{
Book book = new Book();
book.Id = i;
book.Title = string.Format("Title {0}", i);
book.Author = string.Format("Author {0}", i);
book.BindingType = BindingType.Hardback;
book.IsOnSale = true;
book.Price = (decimal)(i * 10.1);
book.Pubdate = DateTime.Now;
_Books.Add(book);
}
// 变量 reoGridControl 是 ReoGridControl 的控件元素实例
_WorksheetModel = new WorksheetModel(reoGridControl, typeof(Book), _Books);
//如果需要在输入值前检查变量的有效性,那么就实现该函数
_WorksheetModel.OnBeforeChangeRecord += OnBeforeChangeRecord;
4.3 在 OnBeforeChangeRecord
函数中演示输入值有效性检查
private bool? OnBeforeChangeRecord(IRecordModel record, PropertyInfo propertyInfo, object newProperyValue)
{
if (propertyInfo.Name.Equals("Price"))
{
decimal price = Convert.ToDecimal(newProperyValue);
if (price > 100m) //假设最大价格是100
{
MessageBox.Show("最大价格是 100, 请重新输入!.", "Alert",
MessageBoxButton.OK, MessageBoxImage.Warning);
return true; // 返回 true 则取消本次输入
}
} return null;
}
4.4 增加、删除、移动、编辑 模型(Model)
// 增加一条书目信息
int count = _Books.Count;
Book book = new Book();
book.Id = count;
book.Title = string.Format("Title {0}", count);
book.Author = string.Format("Author {0}", count);
book.BindingType = BindingType.Hardback;
book.IsOnSale = true;
book.Price = (decimal)(count * 10.11) > 100m ? 100m :(decimal)(count * 10.11);
book.Pubdate = DateTime.Now;
_Books.Add(book); // 移除一条书目信息
if (_Books.Count > )
{
_Books.RemoveAt(_Books.Count - );
} // 移动一条书目信息
if (_Books.Count > )
{
_Books.Move(, _Books.Count - );
} // 编辑一条书目信息
(_Books[] as Book).Price = new Random(DateTime.Now.Millisecond).Next(,);
// 编辑完 模型(Model) 之后要调用 UpadteRecord 函数将模型(Model)的变化同步到视图(View)中
_WorksheetModel.UpadteRecord(_Books[]);
ReoGrid.Mvvm:ReoGrid绑定模型的更多相关文章
- 前端MVVM框架avalon - 模型转换1
轻量级前端MVVM框架avalon - 模型转换(一) 接上一章 ViewModel modelFactory工厂是如何加工用户定义的VM? 附源码 洋洋洒洒100多行内部是魔幻般的实现 1: fun ...
- C#使用Xamarin开发可移植移动应用(3.进阶篇MVVM双向绑定和命令绑定)附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...
- C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...
- 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
前言:在C/S架构上,WPF无疑已经是"桌面一霸"了.在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用.但是WPF也有很多年的历史了,并且基于MVVM ...
- 【Maui正式版】创建可跨平台的Maui程序,以及有关依赖注入、MVVM双向绑定的实现和演示
前言:Maui终于在昨天(2022年8月9日)推送出来了.今儿就迫不及待来把玩一下先. A.我本地已有VS2022,不过版本比较老,此处选择更新.工具 -> 获取功能和更新里面,可以获取到新版本 ...
- WPF采用MVVM模式(绑定:纯前台、命令:触发器绑定命令)
MVVM绑定 view-viewModel-model,模型介绍省略,就是创建类,添加字段封装属性.注:控件的绑定只能绑定到属性上,不能绑定到字段上: 接下来就是代码 (view): <Wind ...
- 轻量级前端MVVM框架avalon - 模型转换
接上一章 ViewModel modelFactory工厂是如何加工用户定义的VM? 附源码 洋洋洒洒100多行内部是魔幻般的实现 1: function modelFactory(scope) { ...
- MVVM命令绑定原理
跟据网上前辈们的资料.了解到命令在MVVM绑定有三种行式. 1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand /// <summa ...
- 仿vue实现简易版mvvm双向绑定
项目地址:https://github.com/pangyongsheng/mvvm 1. 指令 vm-bind 单选数据绑定- 将数据显示到标签视图 vm-model : 双向数据绑定 vm-sho ...
随机推荐
- mapper操作数据的同时返回操作后的值
<insert id="insertSelective" parameterType="com.test.entity.business" keyProp ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(多线程版)
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from queue import Queue import requests from lxml import etree ...
- MongoDB 学习笔记之 mongo-connector安装
mongo-connector安装: https://github.com/mongodb-labs/mongo-connector 1. yum -y install openssl* 2.编译安装 ...
- ECMAScript6 VS TypeScript
如果你真正使用过Typescript你会发现他其实是javascript的超集, 这是一个非常简洁的描述 ,之所以称之为Typescript,正是Type一词的表述(强类型),可不仅仅是有一个Clas ...
- Newtonsoft.Json.Linq 常用方法总结
目录 1.Entity to Json 1.1.准备工作 1.2.Entity to Json 1.3.Json to Entity 2.Linq To Json 2.1.创建对象 2.2.从 Jso ...
- 在Mac上搭建带ssl协议和域名指向的Apache服务器
顾名思义,就是要在苹果电脑上搭建 Apache 服务器,并且支持 https 协议,能用指定域名访问(有些开发调试需要注册域名,比如调试微信JS-SDK),当然最好能在手机端进行调试.首先,Mac 系 ...
- 用CSS绘制实体三角形并说明原理
;;margin:0 auto;border:6px solid transparent;border-top: 6px solid red;} 1.采用的是均分原理 盒子都是一个矩形或正方形,从形状 ...
- Web Storage和cookie的区别——每日一题20190629
Web Storage? 使用HTML5可以在本地存储用户的浏览数据. 使用的主要目的是为了克服Cookie带来的一些限制,当数据需要被严格控制在客户端上时,无需持续的将数据发回服务器 主要目标: 1 ...
- kubernetes垃圾回收器GarbageCollector源码分析(一)
kubernetes版本:1.13.2 背景 由于operator创建的redis集群,在kubernetes apiserver重启后,redis集群被异常删除(包括redis exporter s ...
- Spring Boot 2.x基础教程:Swagger静态文档的生成
前言 通过之前的两篇关于Swagger入门以及具体使用细节的介绍之后,我们已经能够轻松地为Spring MVC的Web项目自动构建出API文档了.如果您还不熟悉这块,可以先阅读: Spring Boo ...