ReoGrid.Mvvm:ReoGrid绑定模型
2024-09-01 12:04:39
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[]);
最新文章
- mvc 重定向的几种方式
- mysql 自定义函数
- [LeetCode] Lowest Common Ancestor of a Binary Tree 二叉树的最小共同父节点
- 5806 NanoApe Loves Sequence Ⅱ(尺取法)
- [Android]官网《Testing Support Library》中文翻译
- MVC返回JSON数据格式书写方式
- android Java BASE64编码和解码一:基础
- c# ToString() 用法
- NSNotificationCenter 的详细说明
- poj 3463 Sightseeing( 最短路与次短路)
- leetcode 60. Permutation Sequence(康托展开)
- word2vec 中的数学原理具体解释(三)背景知识
- TCP的连接和建立 图解
- Python运维开发基础-概述-简介
- golang的GET请求(类似于PHP的CURL)
- position的四种定位方式:static、fixed、relative、absolute
- 利用Clang(Python接口)来解析C++
- centos7.4 python3.6 Anaconda3 的下安装tensorflow
- luogu4182 [USACO18JAN] Lifeguards P (单调队列优化dp)
- eMMC之分区管理、总线协议和工作模式【转】
热门文章
- java.sql.SQLException: Data truncation: Incorrect string value: &#39;\xE5\x91\xA8\xE6\x9D\xBE&#39; for column &#39;cname&#39; at row 1 Query
- 商用hadoop集群的配置命令分布
- 在Debian上用FVWM做自己的桌面
- Excel VBA入门(十)用户窗体开发
- Java8新特性——接口默认方法
- 利用百度云接口实现车牌识别&#183;python
- Python3爬虫基础实战篇之机票数据采集
- Spring IOC(1)----容器刷新(refresh())之前
- malformed header from script. Bad header的解决方法
- Ng的数组绑定