【我們一起寫框架】MVVM的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框架(一)—序篇
【我們一起寫框架】MVVM的WPF框架(二)—繫結
【我們一起寫框架】MVVM的WPF框架(三)—資料控制元件
【我們一起寫框架】MVVM的WPF框架(四)—DataGrid
完
Github地址:https://github.com/kiba518/KibaFramework
----------------------------------------------------------------------------------------------------
注:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文連結!
若您覺得這篇文章還不錯,請點選下右下角的【推薦】,非常感謝!