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[]);

最新文章

  1. mvc 重定向的几种方式
  2. mysql 自定义函数
  3. [LeetCode] Lowest Common Ancestor of a Binary Tree 二叉树的最小共同父节点
  4. 5806 NanoApe Loves Sequence Ⅱ(尺取法)
  5. [Android]官网《Testing Support Library》中文翻译
  6. MVC返回JSON数据格式书写方式
  7. android Java BASE64编码和解码一:基础
  8. c# ToString() 用法
  9. NSNotificationCenter 的详细说明
  10. poj 3463 Sightseeing( 最短路与次短路)
  11. leetcode 60. Permutation Sequence(康托展开)
  12. word2vec 中的数学原理具体解释(三)背景知识
  13. TCP的连接和建立 图解
  14. Python运维开发基础-概述-简介
  15. golang的GET请求(类似于PHP的CURL)
  16. position的四种定位方式:static、fixed、relative、absolute
  17. 利用Clang(Python接口)来解析C++
  18. centos7.4 python3.6 Anaconda3 的下安装tensorflow
  19. luogu4182 [USACO18JAN] Lifeguards P (单调队列优化dp)
  20. eMMC之分区管理、总线协议和工作模式【转】

热门文章

  1. 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
  2. 商用hadoop集群的配置命令分布
  3. 在Debian上用FVWM做自己的桌面
  4. Excel VBA入门(十)用户窗体开发
  5. Java8新特性——接口默认方法
  6. 利用百度云接口实现车牌识别&#183;python
  7. Python3爬虫基础实战篇之机票数据采集
  8. Spring IOC(1)----容器刷新(refresh())之前
  9. malformed header from script. Bad header的解决方法
  10. Ng的数组绑定