【我們一起寫框架】MVVM的WPF框架(五)—完結篇

来源:https://www.cnblogs.com/kiba/archive/2018/10/29/9860135.html
-Advertisement-
Play Games

前言 這篇文章是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

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

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • T1 帽子戲法 問題描述 小 Y 有一個$n n n$的“帽子立方體” ,即一個$n$層的立方體,每層的帽子都 可以排成$n n$的矩陣。 “帽子立方體”中的每一個帽子都有一個顏色,顏色共 26 種,用 26 個大寫字母來表示。 現在,小 Y 邀請小 F 來表演她的帽子戲法。小 F 會 $2$ 種帽 ...
  • 1.EL表達式簡介 EL全名為Expression Language。EL的主要作用為: 獲取數據:EL表達式主要用於替換jsp頁面中的腳本表達式,以從各種類型的web域中檢索java對象,獲取數據。(某個web域中的對象,訪問JavaBean的屬性,訪問list集合,訪問map集合,訪問數組) 執 ...
  • 在開發過程中,需要修改資料庫模型,而且還要在修改之後更新資料庫。最直接的方式就是刪除舊表,但這樣會丟失數據。 更好的解決辦法是使用資料庫遷移框架,它可以追蹤資料庫模式的變化,然後把變動應用到資料庫中。 在Flask中可以使用Flask-Migrate擴展,來實現數據遷移。並且集成到Flask-Scr ...
  • 我們都知道程式員花費大量的時間在編寫、閱讀和編輯代碼上,因此一定要使用高效的文本編輯器才能夠提高並很好的完成工作的效率和保證工作的質量。 什麼是高效的文本編輯器呢?除了自己用的得心應手外,小U認為還應該包含以下幾個特點: ·突出代碼的結構,讓你在編寫代碼時就能夠發現常見的bug; 本人微信:mmp9 ...
  • 題目描述 已知:Sn​=1+1/2+1/3+…+1/n。顯然對於任意一個整數K,當n足夠大的時候,Sn​大於K。 現給出一個整數K(1≤K≤15),要求計算出一個最小的n;使得Sn​>K。 輸入輸出格式 輸入格式: 一個正整數K 輸出格式: 一個正整數N 輸入樣例:1 輸出樣例:2 答案代碼: #i ...
  • 一、前言 之前ZYNQ與PC之間的網路連接依賴於外接硬體協議棧晶元,雖然C驅動非常簡單,但網路帶寬受限。現採用LWIP+PS端MAC控制器+PHY晶元的通用架構。關於LWIP庫,已經有很多現成的資料和書籍。其有兩套API,一個是SOCKET,另一個是本例中要用到的RAW。RAW API理解起來較為復 ...
  • 在這裡我要實現的是Spring的IOC和AOP的核心,而且有關IOC的實現,註解+XML能混合使用! 參考資料: IOC:控制反轉(Inversion of Control,縮寫為IoC),是面向對象編程中的一種設計原則,可以用來減低電腦代碼之間的耦合度。其中最常見的方式叫做依賴註入(Depend ...
  • dfs
    sdfsf ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...