Obecne metody są przeznaczone do tworzenia podstawowych filtrów, a metoda DodajFiltrListyWyboru w założeniu ma przyjmować listę identyfikatorów, które zostaną użyte w wyrażeniu Contains. Tworzenie bardziej zaawansowanych filtrów, w których można by było definiować zachowanie pojedynczych opcji mamy zaplanowane na kolejne wersje. Jednak jak Pan słusznie zauważył, w tym przypadku można zrobić pewne obejście z wykorzystaniem powyższej metody. Nie jest to może najładniejsze rozwiązanie, ale powinno zadziałać
Spójrzmy na początku na sygnaturę tej metody. Oczekuje ona podania w parametrach dwóch delegatów: Func<IEnumerable<WartoscDoWyboru<Guid>>> oraz Func<Guid[], Expression<Func<Asortyment, bool>>>. Zatem rozwiązaniem pierwszego problemu jest stworzenie listy obiektów typu WartoscDoWyboru<Guid> i nadanie im odpowiednich guidów w polu Wartosc. Rozwiązaniem drugiego problemu jest po prostu stworzenie delegata zwracającego powyższą listę opcji. Ostatni parametr metody odpowiada za wygenerowanie wyrażenia filtrującego na podstawie opcji wybranych w filtrze. Jeśli wyłączymy multiselekcję, to zawsze wybrana będzie tylko jedna wartość, więc będziemy mogli posłużyć się wtedy prostymi ifami.
WartoscDoWyboru<Guid>[] opcje = new WartoscDoWyboru<Guid>[]
{
new WartoscDoWyboru<Guid> { Wartosc = new Guid("bf06c73c-bcc8-447a-80f8-ba365b3a3ba7"), Opis = "Tak" },
new WartoscDoWyboru<Guid> { Wartosc = new Guid("ba088d29-6279-4b93-8496-faf7402149b2"), Opis = "Nie" }
};
var definicjaFiltra = rozszerzenie.DodajFiltrListyWyboru<Asortyment, Guid>(
"Pachnący",
() => opcje,
v =>
{
if (v[0] == opcje[0].Wartosc) // wybraną opcją jest "Tak"
{
return a => a.Nazwa.Contains("dezodorant") || a.Nazwa.Contains("perfum");
}
else // wybraną opcją jest "Nie"
{
return a => !(a.Nazwa.Contains("dezodorant") || a.Nazwa.Contains("perfum"));
}
});
definicjaFiltra.WielokrotnyWyborDostepny = false; // wyłączamy multiselekcję