Существует очень четкий ответ, если вы можете использовать формы xamarin 3.5 или выше, BindableLayout.
XAML файл
<ListView
x:Name="listView"
HasUnevenRows="True"
ItemsSource="{Binding Category}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Label Text="{Binding Name}" TextColor="Blue" />
<StackLayout BindableLayout.ItemsSource="{Binding users}">
<BindableLayout.ItemTemplate>
<DataTemplate>
<Label Text="{Binding Name}" />
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
В моей ViewModel
public class DynamicSwitchViewModel:BaseViewModel
{
public DynamicSwitchViewModel(ContentPage view):base(view)
{
ObservableCollection<User> users1 = new ObservableCollection<User>();
users1.Add(new User() { Name = "karan3" });
users1.Add(new User() { Name = "karan4" });
users1.Add(new User() { Name = "karan5" });
ObservableCollection<User> users2 = new ObservableCollection<User>();
users2.Add(new User() { Name = "karan1" });
users2.Add(new User() { Name = "karan2" });
users2.Add(new User() { Name = "karan3" });
users2.Add(new User() { Name = "karan4" });
users2.Add(new User() { Name = "karan5" });
ObservableCollection<User> users3 = new ObservableCollection<User>();
users3.Add(new User() { Name = "karan1" });
users3.Add(new User() { Name = "karan2" });
users3.Add(new User() { Name = "karan3" });
Category = new ObservableCollection<Category>();
Category.Add(new Category() { Name = "1",users=users1 });
Category.Add(new Category() { Name = "2",users=users2 });
Category.Add(new Category() { Name = "3",users=users3 });
}
private ObservableCollection<Category> category;
public ObservableCollection<Category> Category
{
get { return category; }
set { SetProperty(ref category, value); }
}
}
public class Category
{
public ObservableCollection<User> users { get; set; }
public string Name { get; set; }
}
public class User
{
public string Name { get; set; }
}
![Output:](https://i.stack.imgur.com/BTnBS.png)