@@ -101,7 +101,7 @@ public void SetSource(IReadOnlyList<T> items)
101101 {
102102 ArgumentNullException . ThrowIfNull ( items ) ;
103103 _source = items ;
104- ApplyFiltering ( ) ;
104+ ApplyFiltering ( false ) ;
105105 SourceChanged ? . Invoke ( this , EventArgs . Empty ) ;
106106 }
107107
@@ -125,7 +125,7 @@ public void SetFilter(string key, Func<T, bool> filter)
125125 ArgumentNullException . ThrowIfNull ( key ) ;
126126 ArgumentNullException . ThrowIfNull ( filter ) ;
127127 _filters [ key ] = filter ;
128- ApplyFiltering ( ) ;
128+ ApplyFiltering ( true ) ;
129129 FilterChanged ? . Invoke ( this , EventArgs . Empty ) ;
130130 }
131131
@@ -138,7 +138,7 @@ public void RemoveFilter(string key)
138138 ArgumentNullException . ThrowIfNull ( key ) ;
139139 if ( _filters . Remove ( key ) )
140140 {
141- ApplyFiltering ( ) ;
141+ ApplyFiltering ( true ) ;
142142 FilterChanged ? . Invoke ( this , EventArgs . Empty ) ;
143143 }
144144 }
@@ -156,7 +156,7 @@ public void RemoveFilter(string key)
156156 public void ClearFilters ( )
157157 {
158158 _filters . Clear ( ) ;
159- ApplyFiltering ( ) ;
159+ ApplyFiltering ( false ) ;
160160 FilterChanged ? . Invoke ( this , EventArgs . Empty ) ;
161161 }
162162
@@ -199,7 +199,7 @@ public void SetSearch(IEnumerable<Func<T, string>> selectors, string? term, bool
199199 }
200200 else
201201 {
202- ApplyFiltering ( ) ;
202+ ApplyFiltering ( false ) ;
203203 SearchChanged ? . Invoke ( this , EventArgs . Empty ) ;
204204 }
205205 }
@@ -230,13 +230,14 @@ public void SetSearchAll(IEnumerable<Func<T, string>> selectors, string? term, b
230230 }
231231 else
232232 {
233- ApplyFilteringAll ( ) ;
233+ ApplyFilteringAll ( false ) ;
234234 SearchChanged ? . Invoke ( this , EventArgs . Empty ) ;
235235 }
236236 }
237237
238- private void ApplyFilteringAll ( )
238+ private void ApplyFilteringAll ( bool maintainPosition = false )
239239 {
240+ var oldFirstItemIndex = _currentPage * _pageSize ;
240241 IEnumerable < T > query = _source ;
241242
242243 foreach ( var filter in _filters . Values )
@@ -281,7 +282,15 @@ private void ApplyFilteringAll()
281282 }
282283
283284 _filtered = query . ToList ( ) ;
284- _currentPage = 0 ;
285+
286+ if ( maintainPosition && _filtered . Any ( ) )
287+ {
288+ _currentPage = Math . Clamp ( oldFirstItemIndex / _pageSize , 0 , TotalPages - 1 ) ;
289+ }
290+ else
291+ {
292+ _currentPage = 0 ;
293+ }
285294 RaiseAllChanged ( ) ;
286295 }
287296
@@ -293,7 +302,7 @@ public void ClearSearch()
293302 _searchSelectors = [ ] ;
294303 _searchTerm = null ;
295304 _useWildcards = false ;
296- ApplyFiltering ( ) ;
305+ ApplyFiltering ( false ) ;
297306 SearchChanged ? . Invoke ( this , EventArgs . Empty ) ;
298307 }
299308
@@ -308,7 +317,7 @@ public void SetSort<TKey>(Func<T, TKey> selector, bool ascending)
308317 ArgumentNullException . ThrowIfNull ( selector ) ;
309318 _sorts . Clear ( ) ;
310319 _sorts . Add ( ( x => selector ( x ) ! , ascending ) ) ;
311- ApplyFiltering ( ) ;
320+ ApplyFiltering ( true ) ;
312321 SortChanged ? . Invoke ( this , EventArgs . Empty ) ;
313322 }
314323
@@ -318,12 +327,13 @@ public void SetSort<TKey>(Func<T, TKey> selector, bool ascending)
318327 public void ClearSort ( )
319328 {
320329 _sorts . Clear ( ) ;
321- ApplyFiltering ( ) ;
330+ ApplyFiltering ( false ) ;
322331 SortChanged ? . Invoke ( this , EventArgs . Empty ) ;
323332 }
324333
325- private void ApplyFiltering ( )
334+ private void ApplyFiltering ( bool maintainPosition = false )
326335 {
336+ var oldFirstItemIndex = _currentPage * _pageSize ;
327337 IEnumerable < T > query = _source ;
328338
329339 foreach ( var filter in _filters . Values )
@@ -350,25 +360,14 @@ private void ApplyFiltering()
350360 query = query . Where ( item => _searchSelectors . Any ( selector => matches ( selector ( item ) ?? string . Empty ) ) ) ;
351361 }
352362
353- if ( _sorts . Count > 0 )
363+ if ( maintainPosition && _filtered . Any ( ) )
354364 {
355- IOrderedEnumerable < T > ? orderedQuery = null ;
356- foreach ( var ( selector , ascending ) in _sorts )
357- {
358- if ( orderedQuery == null )
359- {
360- orderedQuery = ascending ? query . OrderBy ( selector ) : query . OrderByDescending ( selector ) ;
361- }
362- else
363- {
364- orderedQuery = ascending ? orderedQuery . ThenBy ( selector ) : orderedQuery . ThenByDescending ( selector ) ;
365- }
366- }
367- query = orderedQuery ?? query ;
365+ _currentPage = Math . Clamp ( oldFirstItemIndex / _pageSize , 0 , TotalPages - 1 ) ;
366+ }
367+ else
368+ {
369+ _currentPage = 0 ;
368370 }
369-
370- _filtered = query . ToList ( ) ;
371- _currentPage = 0 ;
372371 RaiseAllChanged ( ) ;
373372 }
374373
@@ -490,6 +489,14 @@ public void GoToLastPage()
490489 GoToPage ( TotalPages ) ;
491490 }
492491
492+ /// <summary>
493+ /// Resets the current page to the first page.
494+ /// </summary>
495+ public void ResetToFirstPage ( )
496+ {
497+ GoToPage ( 1 ) ;
498+ }
499+
493500 /// <summary>
494501 /// Sets the number of items to display per page.
495502 /// </summary>
0 commit comments