概述html
在上面一篇 Windows Community Toolkit 4.0 - DataGrid - Part01 中,咱們針對 DataGrid 控件的 CollectionView 部分作了詳細分享。而在本篇,咱們會對 Utilities 文件夾中的類作詳細的分享。git
下面是 Windows Community Toolkit Sample App 的示例截圖和 code/doc 地址:github
Windows Community Toolkit Doc - DataGridwindows
Windows Community Toolkit Source Code - DataGridthis
Namespace: Microsoft.Toolkit.Uwp.UI.Controls; Nuget: Microsoft.Toolkit.Uwp.UI.Controls.DataGrid;spa
開發過程code
首先再來看一下 Utilities 文件夾的代碼結構:orm
能夠看到 Utilities 文件夾中的類主要是一些基礎和幫助類,下面咱們來看一些重要的類代碼:htm
1. DoubleUtilblog
該類的功能主要是判斷兩個 double 類型的值之間是否接近,大小關係等;這些方法中用到了一個 AreClose(v1, v2) 的方法,這個方法主要判斷兩個數值是否相近,計算方法是,當兩個值的差,除以兩個值的絕對值和加10.0 的值小於 double epsilon 時,認爲兩個數值是接近的。而 double epsilon 表示大於零的最小 double 數值。
internal const double DBL_EPSILON = 1.1102230246251567e-016;
public static bool AreClose(double value1, double value2) { // in case they are Infinities (then epsilon check does not work) if (value1 == value2) { return true; } // This computes (|value1-value2| / (|value1| + |value2| + 10.0)) < DBL_EPSILON double eps = (Math.Abs(value1) + Math.Abs(value2) + 10.0) * DBL_EPSILON; double delta = value1 - value2; return -eps < delta && eps > delta; }
2. Extensions
該類的功能是 DataGrid 控件的擴展,主要有如下擴展方法:
3. IndexToValueTable
該類的功能是 DataGrid 控件的索引和值表之間的處理,咱們看幾個重要的方法:
1) ContainsAll()
該方法的做用是判斷給定的 startIndex 和 endIndex 間的索引範圍,是否所有包含在表中;判斷過程主要是根據 startIndex 和 endIndex 的值,以及 list 中的每一個 range 的 UpperBound 和 LowerBound 的值,判斷 startIndex 和 endIndex 是否包含在某個 range 中;
public bool ContainsAll(int startIndex, int endIndex) { int start = -1; int end = -1; foreach (Range<T> range in _list) { if (start == -1 && range.UpperBound >= startIndex) { if (startIndex < range.LowerBound) { return false; } start = startIndex; end = range.UpperBound; if (end >= endIndex) { return true; } } else if (start != -1) { if (range.LowerBound > end + 1) { return false; } end = range.UpperBound; if (end >= endIndex) { return true; } } } return false; }
2) FindRangeIndex()
獲取當前 range 的索引,計算過程是:遍歷 list 中的 range 集合,計算 front 和 end,每次獲取中間值,若是 range 的上下限包含該 index,返回該 index;不然,根據 front 和 end 的對比,計算值做爲索引返回;
private int FindRangeIndex(int index) { if (_list.Count == 0) { return -1; } int front = 0; int end = _list.Count - 1; Range<T> range = null; while (end > front) { int median = (front + end) / 2; range = _list[median]; if (range.UpperBound < index) { front = median + 1; } else if (range.LowerBound > index) { end = median - 1; } else { return median; } } if (front == end) { range = _list[front]; if (range.ContainsIndex(index) || (range.UpperBound < index)) { return front; } else { return front - 1; } } else { return end; } }
4. TypeHelper
該類是 DataGrid 控件的類型幫助類,主要功能是獲取類型,屬性信息,顯示名等信息。這些方法都是較通用的方法,你們若是有興趣,能夠去詳細查看代碼,這裏不作贅述。
5. ValidationUtil
該類的主要功能是 dataGrid 控件的校驗,咱們來看看 FindEqualValidationResult 方法:
public static ValidationResult FindEqualValidationResult(this ICollection<ValidationResult> collection, ValidationResult target) { foreach (ValidationResult oldValidationResult in collection) { if (oldValidationResult.ErrorMessage == target.ErrorMessage) { bool movedOld = true; bool movedTarget = true; IEnumerator<string> oldEnumerator = oldValidationResult.MemberNames.GetEnumerator(); IEnumerator<string> targetEnumerator = target.MemberNames.GetEnumerator(); while (movedOld && movedTarget) { movedOld = oldEnumerator.MoveNext(); movedTarget = targetEnumerator.MoveNext(); if (!movedOld && !movedTarget) { return oldValidationResult; } if (movedOld != movedTarget || oldEnumerator.Current != targetEnumerator.Current) { break; } } } } return null; }
6. VisualStates
該類是 DataGrid 控件的可視化狀態類,主要分類一下幾種狀態組:
總結
這裏咱們把 DataGrid 的 Utilities 相關類介紹完成了,做爲 DataGrid 相關分享的第二篇,後面咱們會繼續分享最重要的 DataGrid 的相關重點。
最後,再跟你們安利一下 WindowsCommunityToolkit 的官方微博:https://weibo.com/u/6506046490, 你們能夠經過微博關注最新動態。
衷心感謝 WindowsCommunityToolkit 的做者們傑出的工做,感謝每一位貢獻者,Thank you so much, ALL WindowsCommunityToolkit AUTHORS !!!