前言 這篇文章是WPF框架系列的最後一篇,在這裡我想闡述一下我對框架設計的理解。 我對框架設計的理解是這樣的: 框架設計不應該局限於任何一種設計模式,我們在設計框架時,應該將設計模式揉碎,再重組;這樣設計出來的框架才具有一戰之力。 框架設計應該根據項目團隊成員水平量身定製。 我上一篇文章《我們都知道 ...
前言
這篇文章是WPF框架系列的最後一篇,在這裡我想闡述一下我對框架設計的理解。
我對框架設計的理解是這樣的:
框架設計不應該局限於任何一種設計模式,我們在設計框架時,應該將設計模式揉碎,再重組;這樣設計出來的框架才具有一戰之力。
框架設計應該根據項目團隊成員水平量身定製。
我上一篇文章《我們都知道,如何不被淘汰。》中談到,開發人員分為程式員和代碼工人兩種。
這兩種開發人員的技術實力差距是巨大的;如果框架設計時不考慮團隊成員的技術實力,那麼框架很難發揮出最高戰力。
比如,如果開發人員大多是代碼工人,那麼,在設計框架時,要儘量將分工明確考慮進來,讓每個人只負責自己模塊。最簡單的例子就是,前後端分離。
如果開發人員大多是程式員,那麼,在設計框架時,要儘量設計業務線性模塊,讓每個人可以掌控一條業務線,儘量不要前後端分離,儘量採取敏捷設計模式,甚至,可以開放一部分項目經理的職權給開發人員,最大化生產力。
那麼,現在我們一起回頭看看已經編寫完的框架;我們會發現,它是一個將前後臺融合,適合程式員團隊的框架。
DataGrid高級應用
在高級應用中,我們對錶格增加了過濾功能。界面效果如下:
過濾的原理是利用ICollectionView的Filter屬性實現的,由於代碼比較多,這裡就只列出一部分關鍵代碼,具體代碼大家可以去GitHub上下載。
ItemsSourceView.Filter = new Predicate<object>((obj) => { bool isFilter = true; foreach (FilterProperty pinfo in ComparePropertyList) //迴圈篩選出來需要比較的屬性 { string columnNameEn = pinfo.PropertyName; var filterValue = pinfo.PropertyValue;//過濾的值 string columnType = pinfo.PropertyInfo.PropertyType.ToString().Replace("System.Nullable`1[", "").Replace("]", "").Replace("System.", "").ToLower(); if (filterValue != null) { #region 重點內容 這裡開始執行真正的比較 object rowValue = ToolFunction.GetPropertyValue(obj, pinfo.PropertyInfo);//數據行的值 if (rowValue == null) { if (filterValue.ToString() == "") { return true; } else { return false; } } else { isFilter = CompareValue(columnType, rowValue, filterValue, pinfo.ConditionStr); } #endregion } if (!isFilter) { return isFilter; } } return isFilter; });
這上面簡短的代碼中,我們使用了ICollectionView類型的ItemsSourceView.Filter的方法來實現了過濾。
在代碼中可以看到,我們為Filter賦值了一個匿名委托;這個委托有一個入參和一個返回值;其中,入參是我們表格中的行的DataContext,返回值是Bool類型,表示這行在表格中是否顯示。
接下來,我們在委托中對行的DataContext數據進行了比較處理,根據比較結果來確定,該行是否顯示。
UI控制項
在這個框架里,我們UI控制項的目的提高UI與ViewModel的內聚,所以,這裡的UI控制項是一定要和ViewModel打配合的。
這裡我編寫了一個DataGrid的UI控制項,由於這個控制項是最複雜的,如果大家能理解這個控制項,相信,其他控制項也可以信手捏來。
首先,我們先看下UI界面:
接下來,我們看一下Xaml界面的代碼,代碼如下:
<pv:KDataGrid Margin="10,10,10,10" DataContext="{Binding DataGrid,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" > </pv:KDataGrid>
代碼很簡潔,我們只要綁定DataContex即可,當然綁定的數據源是我們的數據控制項DatGrid。
然後,我們看下ViewModel的代碼,代碼如下:
public VM_PageUserList() { Static.StaticData.DataGridConfig.Add(testDataProxy.GetDataGridConfig()); DataGrid.DataGridName = "用戶信息列表"; DataGrid.SkipNumber = 3; DataGrid.BindSource(Load, null); }
在代碼中可以看到,我們首先通過testDataProxy.GetDataGridConfig()方法,從代理中獲取了表格配置。
然後將表格配置賦值給了靜態變數Static.StaticData.DataGridConfig。
然後確定了當前表格的配置名DataGridName為[用戶信息列表] 。
接下來我們正常配置,就實現了表格的展示。
其中表格配置類DataGridConfig代碼如下:
public partial class DataGridConfig { [DataMember] public List<ColumnConfig> ColumnConfig { get; set; } [DataMember] public int DataGridId { get; set; } [DataMember] public string DataGridTemplateName { get; set; } [DataMember] public bool HasFilter { get; set; } [DataMember] public bool HasPaging { get; set; } [DataMember] public int CompanyId { get; set; } [DataMember] public int UserId { get; set; } [DataMember] public string RowForegroundConvert { get; set; } [DataMember] public bool HasNo { get; set; } [DataMember] public int FrozenColumnCount { get; set; } [DataMember] public bool HideControlRow { get; set; } }
這裡,我們定義了列的集合,和表格的一些基礎配置,比如是否開啟過濾,是否開啟分頁等等。
由於代碼實在比較多,所以,這裡就只列出一部分關鍵代碼了,具體代碼還請大家去GitHub上下載閱讀。
其實,這裡的UI控制項編寫,只是為大家提供一個思路,畢竟現實中業務所需的控制項是千奇百怪的,我們是沒辦法編寫出一個萬能控制項的。
----------------------------------------------------------------------------------------------------
WPF框架系列文章,到此就完結了。
框架代碼已經傳到Github上了,歡迎大家下載。
相關文章:
【我們一起寫框架】MVVM的WPF框架(四)—DataGrid
完
Github地址:https://github.com/kiba518/KibaFramework
----------------------------------------------------------------------------------------------------
註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯,請點擊下右下角的【推薦】,非常感謝!