Tabs in dotnet maui have an ‘OnAppearing’ event which you would expect to be called each time a tab is activated. This however is not the case and a possible workaround is to initialize data in a static manner and pass arguments using the ‘Arguments’-construct like shown in this post :
Tab1:
<!--?xml version="1.0" encoding="utf-8" ?-->
<contentpage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:class="MauiApp1.Pages.Tab1" xmlns:local="clr-namespace:MauiApp1.Data" title="Tab1">
<contentpage.bindingcontext>
<local:itemviewmodel>
<x:arguments>
<x:int32>10</x:int32>
</x:arguments>
</local:itemviewmodel>
</contentpage.bindingcontext>
<verticalstacklayout>
<label text="Integers as argument">
<collectionview x:name="collectionView" margin="5" itemtemplate="{StaticResource DataTemplate1}" itemssource="{Binding ItemCollection}" selectionmode="Single">
</collectionview></label></verticalstacklayout>
</contentpage>
Tab2:
<!--?xml version="1.0" encoding="utf-8" ?-->
<contentpage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:class="MauiApp1.Pages.Tab2" xmlns:local="clr-namespace:MauiApp1.Data" title="Tab2">
<contentpage.bindingcontext>
<local:itemviewmodel>
<x:arguments>
<x:int32>20</x:int32>
</x:arguments>
</local:itemviewmodel>
</contentpage.bindingcontext>
<verticalstacklayout>
<label text="Integers as argument">
<collectionview x:name="collectionView" margin="5" itemtemplate="{StaticResource DataTemplate1}" itemssource="{Binding ItemCollection}" selectionmode="Single">
</collectionview></label></verticalstacklayout>
</contentpage>
Tab3:
<!--?xml version="1.0" encoding="utf-8" ?-->
<contentpage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:class="MauiApp1.Pages.Tab3" xmlns:local="clr-namespace:MauiApp1.Data" title="Array of integers">
<contentpage.bindingcontext>
<local:itemviewmodel>
<x:arguments>
<x:array type="{x:Type x:Int32}">
<x:int32>10</x:int32>
<x:int32>11</x:int32>
<x:int32>12</x:int32>
<x:int32>13</x:int32>
<x:int32>14</x:int32>
<x:int32>15</x:int32>
</x:array>
</x:arguments>
</local:itemviewmodel>
</contentpage.bindingcontext>
<verticalstacklayout>
<label text="Array of integers as arguments">
<collectionview x:name="collectionView" margin="5" itemtemplate="{StaticResource DataTemplate1}" itemssource="{Binding ItemCollection}" selectionmode="Single">
</collectionview></label></verticalstacklayout>
</contentpage>
Where the Itemcollection looks like this:
public class ItemViewModel : INotifyPropertyChanged
{
public ItemViewModel( ) {}
public ItemViewModel( int categoryId)
{
this.ItemCollection = new ObservableCollection<item>( );
for( int i = 0; i ‹ 4; i++)
{
this.ItemCollection.Add( new Item( ) { Name = $"V1-{categoryId}", Description = $"c{categoryId}/T1 rocks"});
}
}
public ItemViewModel( int[] categoryIds)
{
this.ItemCollection = new ObservableCollection<item>( );
for( int i = 0; i ‹ categoryIds.Length; i++ )
{
int categoryId = categoryIds[i];
this.ItemCollection.Add( new Item( ) { Name = $"V1-{categoryId}", Description = $"c{categoryId}/T1 rocks"});
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
ArgumentNullException.ThrowIfNull(e);
PropertyChanged?.Invoke(this, e);
}
public ObservableCollection<item> ItemCollection { get; set; }
}
This will result in a nice flexible way of initialisation for tabs:
![]() |
![]() |
![]() |
An example project can be loaded from here.


