ReoGrid.Mvvm:ReoGrid绑定模子
2019-11-18杂谈搜奇网33°c
A+ A-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)
1 [WorksheetAttribute(Title = "Books")] 2 public class Book: IRecordModel 3 { 4 [ColumnHeader(Index = 10, IsVisible = false)] 5 public int Id { get; set; } 6 7 [ColumnHeader(Index = 20, Text = "Name", Width = 150)] 8 public string Title { get; set; } 9 10 [ColumnHeader(Index = 30)] 11 public string Author { get; set; } 12 13 [ColumnHeader(Index = 35, Text = "Type")] 14 public BindingType BindingType { get; set; } 15 16 [ColumnHeader(Index = 36, Text = "OnSale")] 17 public bool IsOnSale { get; set; } 18 19 [NumberFormat(DecimalPlaces = 2)] 20 [ColumnHeader(Index = 40)] 21 public decimal Price { get; set; } 22 23 [DateTimeFormat( CultureName = "en-US")] 24 [ColumnHeader(Index = 45, Text = "Publish Date", Width = 200)] 25 public DateTime Pubdate { get; set; } 26 27 public int RowIndex { get; set; } 28 }
(1) Model 必需完成IRecordModel
接口
IRecordModel
只要一个 RowIndex
属性, 你完整不必管这个属性,这是 ReoGrid.Mvvm
内部用到的。
(2) WorksheetAttribute
用来申明事情表的名字
可选,不指定该特征,那末就用Model类的类名作为事情表称号。
(3) ColumnHeader
特征中, 必需指定 Index
属性,其他的是可选的。
(4) DateTimeFormat
DateTimeFormat
现在不发起运用
ReoGrid
自身并没有完整完成这些特征。固然,也有能够我明白有误。
4. 在ViewModel中修正:
4.1 建立两个成员变量
1 private ObservableCollection<IRecordModel> _Books; 2 private WorksheetModel _WorksheetModel;
4.2 初始化
1 _Books = new ObservableCollection<IRecordModel>(); 2 for (int i = 0; i < 10; i++) 3 { 4 Book book = new Book(); 5 book.Id = i; 6 book.Title = string.Format("Title {0}", i); 7 book.Author = string.Format("Author {0}", i); 8 book.BindingType = BindingType.Hardback; 9 book.IsOnSale = true; 10 book.Price = (decimal)(i * 10.1); 11 book.Pubdate = DateTime.Now; 12 _Books.Add(book); 13 } 14 // 变量 reoGridControl 是 ReoGridControl 的控件元素实例 15 _WorksheetModel = new WorksheetModel(reoGridControl, typeof(Book), _Books); 16 //假如需要在输入值前搜检变量的有效性,那末就完成该函数 17 _WorksheetModel.OnBeforeChangeRecord += OnBeforeChangeRecord;
4.3 在 OnBeforeChangeRecord
函数中演示输入值有效性搜检
1 private bool? OnBeforeChangeRecord(IRecordModel record, PropertyInfo propertyInfo, object newProperyValue) 2 { 3 if (propertyInfo.Name.Equals("Price")) 4 { 5 decimal price = Convert.ToDecimal(newProperyValue); 6 if (price > 100m) //假定最大价钱是100 7 { 8 MessageBox.Show("最大价钱是 100, 请从新输入!.", "Alert", 9 MessageBoxButton.OK, MessageBoxImage.Warning); 10 return true; // 返回 true 则作废本次输入 11 } 12 } 13 14 return null; 15 }
4.4 增添、删除、挪动、编辑 模子(Model)
1 // 增添一条书目信息 2 int count = _Books.Count; 3 Book book = new Book(); 4 book.Id = count; 5 book.Title = string.Format("Title {0}", count); 6 book.Author = string.Format("Author {0}", count); 7 book.BindingType = BindingType.Hardback; 8 book.IsOnSale = true; 9 book.Price = (decimal)(count * 10.11) > 100m ? 100m :(decimal)(count * 10.11); 10 book.Pubdate = DateTime.Now; 11 _Books.Add(book); 12 13 // 移除一条书目信息 14 if (_Books.Count > 0) 15 { 16 _Books.RemoveAt(_Books.Count - 1); 17 } 18 19 // 挪动一条书目信息 20 if (_Books.Count > 2) 21 { 22 _Books.Move(0, _Books.Count - 1); 23 } 24 25 // 编辑一条书目信息 26 (_Books[0] as Book).Price = new Random(DateTime.Now.Millisecond).Next(1,100); 27 // 编辑完 模子(Model) 以后要挪用 UpadteRecord 函数将模子(Model)的变化同步到视图(View)中 28 _WorksheetModel.UpadteRecord(_Books[0]);
未定义标签