檢視過濾

Jchkds發表於2024-05-15

過濾

ICollictionView的屬性Filter接受一個bool Predicate<Object>(Object obj)的方法,obj是資料來源集合中的元素,需要我們自己型別轉換,滿足條件要顯示的元素返回true,否則返回false.

ListCollectionView.Filter = new Predicate<object>((obj) =>
{
    User user = obj as User;
    return user.Name.Contains("J");
});

過濾出名字中含有字母J的使用者。

複雜過濾介面有以下特點:

  • 會有很多種過濾條件且可選擇是否啟用此條件,一般勾選核取方塊決定在過濾時使用哪些過濾條件。
  • 每個過濾條件接受鍵盤的輸入作為引數進行調節,如範圍過濾器。

針對複雜過濾介面,我們可以考慮使用介面來優雅的實現過濾邏輯。

UserFilter filters = new UserFilter();
IFilter af = new AddressFilter("州"); // 地址含有“州”字
IFilter arf = new AgeRangeFilter(25, 22); // 年齡在22-25歲
filters.Add(af);
filters.Add(arf);
ListCollectionView.Filter = filters.Predicate;

public interface IFilter
{
    bool Predicate(object item);
}

public class AddressFilter : IFilter
{
    public string KeyWord { get; set; }

    public AddressFilter(string keyWord)
    {
        KeyWord = keyWord;
    }

    public bool Predicate(object item)
    {
        var user = item as User;
        return user.Address!.Contains(KeyWord);
    }
}

public class AgeRangeFilter : IFilter
{
    public int Max { get; set; }
    public int Min { get; set; }

    public AgeRangeFilter(int max, int min)
    {
        Max = max;
        Min = min;
    }

    public bool Predicate(object item)
    {
        var user = item as User;
        return user.Age >= Min && user.Age <= Max;
    }
}

public class UserFilter : List<IFilter>, IFilter
{
    public bool Predicate(object item)
    {
        foreach (var filter in this)
        {
            if (!filter.Predicate(item))
                return false;
        }
        return true;
    }
}

filters新增多個過濾條件,所有的過濾條件全部透過,元素才會顯示。filters可增刪過濾條件實現動態啟用部分過濾條件。每個過濾器物件的屬性是它的過濾條件的引數,可以被更改,但是需要手動呼叫ICollectionView.Refresh( ),UI才能顯示按照新引數過濾後的元素。

每次給ICollectionView的Filter賦新值,都會自動觸發UI遵照檢視過濾條件重新整理顯示。放棄所有過濾條件展示資料來源集合的所有元素:ICollectionView.Filter = null;

常見的過濾場景:使用者在文字框輸入過濾引數,捕獲TextChanged事件,執行ICollectionView.Refresh( ).

程序導向切換成物件導向的思路:方法轉換成類的招數->可將方法的引數轉換成類的欄位,例項化類即完成了相當於實參的欄位的賦值,然後呼叫例項方法,相當於完成了實參的傳遞!對於委託型別固定的引數,能接受的方法簽名是固定的,當我們想傳入簽名不一致的方法時,可以考慮將方法轉換成類!

相關文章