1. 程式人生 > >【我們一起寫框架】MVVM的WPF框架(五)—完結篇

【我們一起寫框架】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

----------------------------------------------------------------------------------------------------

注:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文連結!
若您覺得這篇文章還不錯,請點選下右下角的推薦】,非常感謝!