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