@@ -47,6 +47,10 @@ public sealed class Virtualize<TItem> : ComponentBase, IVirtualizeJsCallbacks, I
47
47
48
48
private RenderFragment < PlaceholderContext > ? _placeholder ;
49
49
50
+ private RenderFragment ? _emptyContent ;
51
+
52
+ private bool _loading ;
53
+
50
54
[ Inject ]
51
55
private IJSRuntime JSRuntime { get ; set ; } = default ! ;
52
56
@@ -68,6 +72,13 @@ public sealed class Virtualize<TItem> : ComponentBase, IVirtualizeJsCallbacks, I
68
72
[ Parameter ]
69
73
public RenderFragment < PlaceholderContext > ? Placeholder { get ; set ; }
70
74
75
+ /// <summary>
76
+ /// Gets or sets the content to show when <see cref="Items"/> is empty
77
+ /// or when the <see cref="ItemsProviderResult<TItem>.TotalItemCount"/> is zero.
78
+ /// </summary>
79
+ [ Parameter ]
80
+ public RenderFragment ? EmptyContent { get ; set ; }
81
+
71
82
/// <summary>
72
83
/// Gets the size of each item in pixels. Defaults to 50px.
73
84
/// </summary>
@@ -167,6 +178,7 @@ protected override void OnParametersSet()
167
178
168
179
_itemTemplate = ItemContent ?? ChildContent ;
169
180
_placeholder = Placeholder ?? DefaultPlaceholder ;
181
+ _emptyContent = EmptyContent ;
170
182
}
171
183
172
184
/// <inheritdoc />
@@ -213,15 +225,19 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
213
225
214
226
_lastRenderedItemCount = 0 ;
215
227
216
- // Render the loaded items.
217
- if ( _loadedItems != null && _itemTemplate != null )
228
+ if ( _loadedItems != null && ! _loading && _itemCount == 0 && _emptyContent != null )
229
+ {
230
+ builder . AddContent ( 4 , _emptyContent ) ;
231
+ }
232
+ else if ( _loadedItems != null && _itemTemplate != null )
218
233
{
219
234
var itemsToShow = _loadedItems
220
235
. Skip ( _itemsBefore - _loadedItemsStartIndex )
221
236
. Take ( lastItemIndex - _loadedItemsStartIndex ) ;
222
237
223
- builder . OpenRegion ( 4 ) ;
238
+ builder . OpenRegion ( 5 ) ;
224
239
240
+ // Render the loaded items.
225
241
foreach ( var item in itemsToShow )
226
242
{
227
243
_itemTemplate ( item ) ( builder ) ;
@@ -235,7 +251,7 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
235
251
236
252
_lastRenderedPlaceholderCount = Math . Max ( 0 , lastItemIndex - _itemsBefore - _lastRenderedItemCount ) ;
237
253
238
- builder . OpenRegion ( 5 ) ;
254
+ builder . OpenRegion ( 6 ) ;
239
255
240
256
// Render the placeholders after the loaded items.
241
257
for ( ; renderIndex < lastItemIndex ; renderIndex ++ )
@@ -247,9 +263,9 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
247
263
248
264
var itemsAfter = Math . Max ( 0 , _itemCount - _visibleItemCapacity - _itemsBefore ) ;
249
265
250
- builder . OpenElement ( 6 , SpacerElement ) ;
251
- builder . AddAttribute ( 7 , "style" , GetSpacerStyle ( itemsAfter ) ) ;
252
- builder . AddElementReferenceCapture ( 8 , elementReference => _spacerAfter = elementReference ) ;
266
+ builder . OpenElement ( 7 , SpacerElement ) ;
267
+ builder . AddAttribute ( 8 , "style" , GetSpacerStyle ( itemsAfter ) ) ;
268
+ builder . AddElementReferenceCapture ( 9 , elementReference => _spacerAfter = elementReference ) ;
253
269
254
270
builder . CloseElement ( ) ;
255
271
}
@@ -354,6 +370,7 @@ private async ValueTask RefreshDataCoreAsync(bool renderOnSuccess)
354
370
{
355
371
_refreshCts = new CancellationTokenSource ( ) ;
356
372
cancellationToken = _refreshCts . Token ;
373
+ _loading = true ;
357
374
}
358
375
359
376
var request = new ItemsProviderRequest ( _itemsBefore , _visibleItemCapacity , cancellationToken ) ;
@@ -368,6 +385,7 @@ private async ValueTask RefreshDataCoreAsync(bool renderOnSuccess)
368
385
_itemCount = result . TotalItemCount ;
369
386
_loadedItems = result . Items ;
370
387
_loadedItemsStartIndex = request . StartIndex ;
388
+ _loading = false ;
371
389
372
390
if ( renderOnSuccess )
373
391
{
0 commit comments