In Xamarin.Forms 3.5 the BindableLayout
was introduced in order to provide functionality similar to a “repeater.” In nearly every Xamarin project I’ve worked on, I’ve needed a repeater of some sort. So, I’d usually create a custom control for this, which would take an ItemsSource
and an ItemTemplate
, but I don’t have to anymore. This functionality was introduced in Xamarin.Forms
3.5.
While many of the use cases I was solving for with my own “repeater” can now be solved by the Bindable StackLayout
, I feel like we are overlooking that the BindableLayout
isn’t just for the StackLayout
. In fact, it’s for anything that derives from Layout
. This is awesome, because it means that the following layouts, can all have a bindable set of items:
I have to admit, I haven’t figured out all of the potential use cases for binding these different types of layouts, but the main one that comes to mind is the FlexLayout
. The FlexLayout
was introduced back in Xamarin.Forms
3.1, and provides a couple of awesome features allowing your layouts to automatically space and distribute evenly accross different device types.
While the following example is nearly the same as the example in the blog post announcing BindableLayout
’s, I feel that other layout types deserve a little love too. So, let’s go ahead and use a Bindable FlexLayout
.
<ScrollView>
<FlexLayout
BindableLayout.ItemsSource="{Binding Items}"
Wrap="Wrap"
Direction="Row"
JustifyContent="Center"
AlignItems="Center"
AlignContent="Start">
<BindableLayout.ItemTemplate>
<DataTemplate>
<StackLayout Orientation="Horizontal">
<Label
Text="{Binding Name}"
HorizontalOptions="StartAndExpand" />
<Label
Text="{Binding Author}"
HorizontalOptions="EndAndExpand" />
</StackLayout>
</DataTemplate>
</BindableLayout.ItemTemplate>
</FlexLayout>
</ScrollView>
There are a couple of key parts that make the above example work. You are probably familair with them if you’ve used the ListView
before.
BindableLayout.ItemsSource="{Binding Items}"
- This line specifies anItemsSource
IEnumerable
which provides the “repeater” functionality for whatever list of items you provide.<BindableLayout.ItemTemplate>
- This provides the template for each item that is bound. Above we have two labels with name and author information.ScrollView
- TheFlexLayout
does not automatically provide scroll functionality for when there are too many items to fit onscreen, so we wrap the layout in aScrollView
.
And that’s it. We now have a view that is bound to our list of objects, and will resize automatically across layouts and device types.