Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to bind list inside ListView in Xamarin.Forms

I have one ListView on my page having ItemSource as List<AssetModel> as shown below:

public class AssetModel
{
    public string AssetId { get; set; }
    public string Description { get; set; }

    public List<TaskDetail> TaskDetailList { get; set; }
}

public class TaskDetail
{
    public string Description { get; set; }
}

How can I bind TaskDetail list in my parent list?

Desired Layout:

enter image description here

like image 405
Neelam Prajapati Avatar asked Feb 26 '18 12:02

Neelam Prajapati


People also ask

What is list view in Xamarin forms?

The ListView class supports a number of interaction styles. Pull-to-refresh allows the user to pull the ListView down to refresh the contents. Context actions allow the developer to specify custom actions on individual list items. For example, you can implement swipe-to-action on iOS, or long-tap actions on Android.

What is difference between ListView and CollectionView in xamarin forms?

While the CollectionView and ListView APIs are similar, there are some notable differences: CollectionView has a flexible layout model, which allows data to be presented vertically or horizontally, in a list or a grid. CollectionView supports single and multiple selection. CollectionView has no concept of cells.

What is Datatemplate in xamarin forms?

The DataTemplateSelector is a class that lets you change the data template you want to use, in a ListView or CarouselView, depending upon the type of data for each item, in the list. Rather than making a complex ViewCell or ItemTemplate, you can design each one specifically for the type of data you want.

How do you implement ListView in xamarin forms?

Put a ViewCell in it and add Three labels with a image. To add the image just simply copy it and paste outside to your UWP or Android project and add the reference to your tag. And bind each of them with the same name of the property in contacts class.


1 Answers

It seems like a classic grouping listview use case. James Montemagno wrote an article about this kind of need that should help you a lot.

In summary, the grouping feature expects an object of type 'List of List' (IEnumerable<IEnumerable<>>), where each 'master item' is a list of 'detail item'.

To make it easy, you can use the class provided at the above mentioned article:

public class Grouping<K, T> : ObservableCollection<T>
{
    public K Key { get; private set; }

    public Grouping(K key, IEnumerable<T> items)
    {
        Key = key;
        foreach (var item in items)
            this.Items.Add(item);
    }
}

Then, the list property you must change its type to, for example, this:

ObservableCollection<Grouping<AssetModel, TaskDetail>> AssetsList { get; set; } = 
    new ObservableCollection<Grouping<AssetModel, TaskDetail>>();

This AssetsList is what you should bind to the ItemsSource of ListView

To fill this property, you'll need, for example, do this:

for (int i = 0; i < 5; i++)
{
    var asset = new AssetModel();
    asset.AssetId = new Guid().ToString();
    asset.Description = $"Asset { i + 1} ";
    asset.TaskDetailList = new List<TaskDetail>();

    for (int j = 0; j < 3; j++)
        asset.TaskDetailList.Add(new TaskDetail() { Description = $"Detail { (i + 1) } - { (j + 1) }" });

    var group = new Grouping<AssetModel, TaskDetail>(asset, asset.TaskDetailList);

    AssetsList.Add(group);
}

Then in your XAML you define your ListView Grouping properties:

<ListView ItemsSource="{Binding AssetsList}" 
          HasUnevenRows="True" 
          SeparatorVisibility="None"
          SeparatorColor="Transparent"
          IsGroupingEnabled="True">
    <ListView.GroupHeaderTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout>
                    <StackLayout Orientation="Horizontal">
                        <Label Text="AssetId"
                               FontAttributes="Bold"/>
                        <Label Text={Binding Key.AssetId}/>
                    </StackLayout>
                    <StackLayout Orientation="Horizontal">
                        <Label Text="Description"
                               FontAttributes="Bold"/>
                        <Label Text={Binding Key.Description}/>
                    </StackLayout>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.GroupHeaderTemplate>
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout>
                    <Label Text={Binding Description}/>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
like image 127
Diego Rafael Souza Avatar answered Sep 17 '22 20:09

Diego Rafael Souza