NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Majkel
Člen
Avatar
Majkel:8.4.2016 22:49

Ahoj, mám WPF (MVVM) aplikaci, kde mám ObservableCollec­tion vlastního datového typu, nabindovanou na DataGrid. V tomto DataGridu jsem potřeboval udělat dynamické vyhledávání. To jsem vyřešil tak, že jsem přidal další List stejného datového typu, kde mám kopii oné ObservableCollec­tion a z tohoto Listu pak provádím filtrování, za pomoci Linq dotazu pokaždé, když dojde v TextBoxu k TextChanged eventu.

Nejsem si ale jistý, co to udělá, když bude záznamů větší množství. Mohl bych to změnit tak, že vyhledávání proběhne až po stisku Enter, ale to dynamické se mi líbí více. Neexistuje ale nějaký lepší způsob, jak ho implementovat?

 
Odpovědět
8.4.2016 22:49
Avatar
Odpovídá na Majkel
Neaktivní uživatel:8.4.2016 23:24

Pro tyto účely se používá CollectionView. Použití v MVVM je to jednoduché. V view budeš mít binding tak jak doposud, tedy na celou kolekci. Ve ViewModelu pak vždy, když nastavuješ tu kolekci, musíš udělat následující:

Items = new ObservableCollection<MyItem>();
// nastavení dat do Items
var view = CollectionViewSource.GetDefaultView(Items); // vrací ICollectionView
view.Filter = MyFilter;

Kde MyFilter je metoda, např.

private bool MyFilter(object obj)
{
    var item = obj as MyItem;
    return item.Name.Contains(FilterText);
}

S tím, že FilterText je text nabindovaný na TextBox.

Kromě filtrování ICollectionView umí také řazení (i podle jednotlivých sloupců DataGridu) a seskupování.
Při změně filtru je potřeba volat view.Refresh(), proto je dobré si ten pohled někam uložit.

Nahoru Odpovědět
8.4.2016 23:24
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.