WPF轉換器之通用轉換器

来源:http://www.cnblogs.com/ShenNan/archive/2017/07/27/7244402.html
-Advertisement-
Play Games

WPF中的轉換器是一個非常好的數據類型轉換解決方案,實用和強大, 它的作用是將源數據轉換為WPF自身需要的類型,對數據實體沒有侵略性,會在項目工程中頻繁使用。所以掌握轉換器是WPF開發的必備技能。 我剛接觸轉換器的時候,沒有考慮通用性,每次遇到一個轉換需求都會去創建一個新的轉換器,久而久之,項目中的 ...


WPF中的轉換器是一個非常好的數據類型轉換解決方案,實用和強大, 它的作用是將源數據轉換為WPF自身需要的類型,對數據實體沒有侵略性,會在項目工程中頻繁使用。所以掌握轉換器是WPF開發的必備技能。

我剛接觸轉換器的時候,沒有考慮通用性,每次遇到一個轉換需求都會去創建一個新的轉換器,久而久之,項目中的轉換器已多如牛毛

這當然是我無法容忍的,我決定用一種通用轉換器來代替絕大部分性質相同的轉換操作,通過約定一套參數規則來適應不同的轉換場景,達到轉換器復用的目的。

轉換器分為兩種,IValueConverter(單值轉換器)和IMultiValueConverter(多值轉換器)

單值通用轉換器 ObjectConverter

參數規則【比較值1|比較值2:true返回值:false返回值】

仔細一看,這個參數規則其實和三元表達式的含義相同,當源數據等於比較值1或者比較值2的時候,返回true返回值,否則返回false返回值

有了這個規則,就可以實現通用轉換需求了,ObjectConverter源碼如下

 public class ObjectConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string[] parray = parameter.ToString().ToLower().Split(':'); //將參數字元分段 parray[0]為比較值,parray[1]為true返回值,parray[2]為false返回值
            if (value == null)
                return parray[2];  //如果數據源為空,預設返回false返回值
            if (parray[0].Contains("|"))  //判斷有多個比較值的情況
                return parray[0].Split('|').Contains(value.ToString().ToLower()) ? parray[1] : parray[2];  //多值比較
            return parray[0].Equals(value.ToString().ToLower()) ? parray[1] : parray[2];  //單值比較
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var returnValue = "otherValue";
            string[] parray = parameter.ToString().ToLower().Split(':');
            if (value == null)
                return returnValue;
            var valueStr = value.ToString().ToLower();
            if (valueStr != parray[1])
                return returnValue;
            else
                return parray[0].Contains('|') ? parray[0].Split('|')[0] : parray[0];
        }
    }

 ObjectConverter的使用

1 <converter:ObjectConverter x:Key="objConverter"/>
2 
3 <Border Visibility="{Binding PanelStatus,  Converter={StaticResource objConverter},ConverterParameter=true:Visible:Collapsed}">
4 
5 <Border Background="{Binding BgColor,  Converter={StaticResource objConverter},ConverterParameter=1:Red:Blue}">
6 
7 <TextBlock Text="{Binding Type, Converter={StaticResource objConverter},ConverterParameter=1|2:VIP會員:普通會員}"/>

 

多值通用轉換器 MultiObjectConverter

參數規則【各組比較值:比較條件(&amp;或|):true返回值:false返回值:返回值類型枚舉】

多值轉換器的參數規則略顯麻煩,但是也和三元表達式類似,只不過多了比較條件和返回值枚舉類型,這裡有人要問了為什麼單值轉換器不需要聲明返回值枚舉而多值轉換器需要,這是因為多值轉換器的返回值不返回實際類型的話,返回類型會失效,WPF的預設轉換器似乎沒有起到作用。這個問題我也正在研究,所以先定義一個返回值枚舉用來轉換返回值的類型。姑且算一個臨時解決方案吧

 1 public class MultiObjectConverter : IMultiValueConverter
 2     {
 3         /// <summary>
 4         /// 多值轉換器
 5         /// </summary>
 6         /// <param name="values">參數值數組</param>
 7         /// <param name="parameter">
 8         /// <para>參數</para>
 9         /// <para>各組比較值:比較條件(&amp;或|):true返回值:false返回值:返回值類型枚舉</para>
10         /// <para>v1;v2-1|v2-2;v3:&amp;:Visible:Collapsed:1</para>
11         /// </param>
12         /// <returns></returns>
13         public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
14         {
15             string[] param = parameter.ToString().ToLower().Split(':');   //將參數字元串分段
16             string[] compareValues = param[0].Split(';'); //將比較值段分割為數組
17             if (values.Length != compareValues.Length)  //比較源數據和比較參數個數是否一致
18                 return ConvertValue(param[3], param[4]);
19             var trueCount = 0; //滿足條件的結果數量
20             var currentValue = string.Empty;
21             IList<string> currentParamArray = null;
22             for (var i = 0; i < values.Length; i++)
23             {
24                 currentValue = values[i] != null ? values[i].ToString().ToLower() : string.Empty;
25                 if (compareValues[i].Contains("|"))
26                 {
27                     //當前比較值段包含多個比較值
28                     currentParamArray = compareValues[i].Split('|'); 
29                     trueCount += currentParamArray.Contains(currentValue) ? 1 : 0;  //滿足條件,結果+1
30                 }
31                 else
32                 {
33                     trueCount += compareValues[i].Equals(currentValue) ? 1 : 0;  //滿足條件,結果+1
34                 }
35             }
36             currentParamArray = null;
37             currentValue = string.Empty;
38             var compareResult = param[1].Equals("&") ?
39                 trueCount == values.Length :
40                 trueCount > 0;   //判斷比較結果
41             return ConvertValue(compareResult ? param[2] : param[3], param[4]);
42         }
43 
44         public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
45         {
46             throw new NotImplementedException();
47         }
48 
49         private object ConvertValue(string result, string enumStr)
50         {
51             var convertResult = (ConvertResult)int.Parse(enumStr);
52             if (convertResult == ConvertResult.顯示類型)
53                 return result.Equals("collapsed") ? Visibility.Collapsed : Visibility.Visible;
54             if (convertResult == ConvertResult.布爾類型)
55                 return System.Convert.ToBoolean(result);
56             return null;  //後續自行擴展
57         }
58 
59         private enum ConvertResult
60         {
61             顯示類型 = 1,
62             布爾類型 = 2,
63             字元串類型 = 3,
64             整型 = 4,
65             小數型 = 5,
66             畫刷類型 = 6,
67             樣式類型 = 7,
68             模板類型 = 8
69         }
70     }

MulitObjectConverter的使用

1 <TextBlock Text="test">
2    <TextBlock.Visibility>
3         <MultiBinding Converter="{StaticResource mobjConverter}"
4                       ConverterParameter="1|2;true:|:Visible:Collapsed:1">
5              <Binding Path="Filed1"/>
6              <Binding Path="Filed2"/>
7         </MultiBinding>
8     </TextBlock.Visibility>
9 </TextBlock>    

單值通用轉換器和多值通用轉換器已經講完了,讀者可以根據自己的需求定製ConverterParameter的規則,實現靈活擴展。歡迎入群交流372754241


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

-Advertisement-
Play Games
更多相關文章
  • 控制項Group Box預設的邊框的顏色是白色的,在很多時候顯得不那麼突出。但預設的屬性列表裡面並沒有提供相應的介面。所以只能藉助重繪事件。 網上很多都說使用 OnPaint 事件,但是我在事件列表中沒找到,應該是隱藏得太深了(需要用 override 關鍵字來重寫)。我這裡直接使用了 Paint 事 ...
  • 以前寫抓取網頁的代碼喜歡用ReadToEnd,因為簡單省事,後來發現,在爬取網頁的時候,如果網速很慢,ReadToEnd超時的幾率很大。使用Read改寫後,超時幾率大大減小,完整代碼如下: /// <summary> /// HttpPost /// </summary> public static ...
  • 寫了一個Windows服務,通過C#模擬網站用戶登錄並爬取BUG列表查詢有沒有新的BUG,並提醒我 1、HttpUtil工具類,用於模擬用戶登錄以及爬取網頁: using System; using System.Collections.Generic; using System.IO; using ...
  • 最近天氣燥熱。。很難靜下心來。 因為有一些事情,所以耽擱了。 2.1 Main Camera 調節main camera相關屬性,可令目標模型處於視野里的合適位置。 開始的時候重置它的Transform。 然後根據你的實際需要及Scene和Game視圖調節目標模型的相對位置以及看起來的大小。 與直接 ...
  • Java(234,587) 前端(104,327) PHP(90,265) .Net(57,576) .Net的市場需求為何相對Java和PHP這麼低!!! ...
  • 首先我介紹一下為什麼我需要用到ajax技術 1.頁面上有個text類型的輸入框,當我點擊提交的時候,可以把文本框中的值傳遞到後臺去 2.後臺接收傳遞的參數 3.連接資料庫,把傳遞來的內容添加到資料庫里 4.再調用方法把返回值又傳遞到前臺,前臺直接展示我們輸入的內容 前臺 html代碼 @model ...
  • EF Core一次準備多個語句,然後在單次請求中執行它們,所以能提供了更好的性能和速度。本文將介紹它是如何工作的。 ...
  • Visual Studio Ultimate 2013 KEY(密鑰):BWG7X-J98B3-W34RT-33B3R-JVYW9Visual Studio Premium 2013 KEY(密鑰):FBJVC-3CMTX-D8DVP-RTQCT-92494Visual Studio Profess ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...