电竞比分网-中国电竞赛事及体育赛事平台

分享

ReoGrid.Mvvm:ReoGrid綁定模型

 頭號(hào)碼甲 2020-05-13

ReoGrid 是 C# 編寫(xiě)的.NET 電子表格控件(類(lèi)似 Excel)。支持單元格合并,邊框樣式,圖案背景顏色,數(shù)據(jù)格式,凍結(jié),公式,宏和腳本執(zhí)行,表格事件等。支持 Winform\WPF。

ReoGrid.Mvvm 是針對(duì) ReoGrid.WPF 編寫(xiě)的一個(gè)開(kāi)源類(lèi)庫(kù),用于方便地將控件綁定到模型,從而實(shí)現(xiàn)模型(Model)和視圖(View)的分離,適用于MVVM模式的開(kāi)發(fā)。

 

項(xiàng)目地址https://github.com/IUpdatable/ReoGrid.Mvvm,歡迎star

 

下面以一個(gè)圖書(shū)信息的簡(jiǎn)單項(xiàng)目演示如何使用 ReoGrid.Mvvm. 完整代碼見(jiàn)項(xiàng)目 ReoGrid.Mvvm.Demo.

演示效果如圖

 

1. 創(chuàng)建一個(gè) WPF 項(xiàng)目

2. NuGet 安裝 ReoGrid.Mvvm

Install-Package ReoGrid.Mvvm

 

3. 創(chuàng)建一個(gè)圖書(shū)的模型(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 必須實(shí)現(xiàn)IRecordModel接口

IRecordModel 只有一個(gè) RowIndex 屬性, 你完全不用管這個(gè)屬性,這是 ReoGrid.Mvvm 內(nèi)部用到的。

 

(2) WorksheetAttribute 用來(lái)說(shuō)明工作表的名字

可選,不指定該特性,那么就用Model類(lèi)的類(lèi)名作為工作表名稱(chēng)。

 

(3) ColumnHeader特性中, 必須指定 Index 屬性,其他的是可選的。

 

(4) DateTimeFormat DateTimeFormat 目前不建議使用

ReoGrid本身并沒(méi)有完整實(shí)現(xiàn)這些特性。當(dāng)然,也有可能我理解有誤。

 

4. 在ViewModel中修改:

4.1 創(chuàng)建兩個(gè)成員變量

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 的控件元素實(shí)例
15 _WorksheetModel = new WorksheetModel(reoGridControl, typeof(Book), _Books);
16 //如果需要在輸入值前檢查變量的有效性,那么就實(shí)現(xiàn)該函數(shù)
17 _WorksheetModel.OnBeforeChangeRecord += OnBeforeChangeRecord;

 

 4.3 在 OnBeforeChangeRecord 函數(shù)中演示輸入值有效性檢查

 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) //假設(shè)最大價(jià)格是100
 7         {
 8             MessageBox.Show("最大價(jià)格是 100, 請(qǐng)重新輸入!.", "Alert", 
 9                             MessageBoxButton.OK, MessageBoxImage.Warning);
10             return true; // 返回 true 則取消本次輸入
11         }
12     }
13 
14     return null;
15 }

 

4.4 增加、刪除、移動(dòng)、編輯 模型(Model)

 1 // 增加一條書(shū)目信息
 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 // 移除一條書(shū)目信息
14 if (_Books.Count > 0)
15 {
16     _Books.RemoveAt(_Books.Count - 1);
17 }
18 
19 // 移動(dòng)一條書(shū)目信息
20 if (_Books.Count > 2)
21 {
22     _Books.Move(0, _Books.Count - 1);
23 }
24 
25 // 編輯一條書(shū)目信息
26 (_Books[0] as Book).Price = new Random(DateTime.Now.Millisecond).Next(1,100);
27 // 編輯完 模型(Model) 之后要調(diào)用 UpadteRecord 函數(shù)將模型(Model)的變化同步到視圖(View)中
28 _WorksheetModel.UpadteRecord(_Books[0]); 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多