Diskuze: Dynamické vyhledávání ve WPF DataGrid

C# .NET .NET (C# a Visual Basic) Dynamické vyhledávání ve WPF DataGrid American English version English version

Avatar
Majkel
Člen
Avatar
Majkel:

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. dubna 22:49
Avatar
Posix
Člen
Avatar
Odpovídá na Majkel
Posix:

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. dubna 23:24
Proč to dělat jednoduše, když to jde složitě.
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.