jxalexan 56
jxalexan 56

Reputation: 3

CollectionView not displaying content in .net MAUI

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MonkeyFinder.TopicsPage"
             xmlns:model="clr-namespace:MonkeyFinder.Model"
             xmlns:viewmodel="clr-namespace:MonkeyFinder.ViewModel"
             xmlns:control="clr-     namespace:Syncfusion.Maui.ProgressBar;assembly=Syncfusion.Maui.ProgressBar">

<CollectionView BackgroundColor="Transparent">

    <CollectionView.ItemTemplate>

        <DataTemplate>

            <Image Source="traffic_light.png"/>

        </DataTemplate>

    </CollectionView.ItemTemplate>
    
</CollectionView>

Hi .net MAUI beginner here, was trying to create a collectionview with data binding within a tabbed page but couldn't get the content to appear. Simplified the CollectionView but still couldn't get any content within the collectionview to show. I know the collectionview is visible because when i change the backgroundcolour of the collectionview the colour of the page changes. I can also see content within the contentpage if it is outside the collectionview. No idea what i'm doing wrong :/

Upvotes: 0

Views: 986

Answers (1)

Julian
Julian

Reputation: 8864

CollectionView is not a layout. It is a container for collections of data, hence the name.

If you want to display an image like in the code in your question, just use a Grid or a VerticalStackLayout:

<Grid>
    <Image Source="traffic_light.png"/>
</Grid>

If you want to use data binding, you need a binding source, e.g. an ObservableCollection<T> where T is the data type of the elements of the collection.

Let's assume you have a ViewModel, you can create such a collection, let's call it Items:

public class MyViewModel : INotifyPropertyChanged
{
    private ObservableCollection<string> items;
    public ObservableCollection<string> Items
    {
        get => items;
        set
        {
            if(items == value) return;
            items = value;
            OnPropertyChanged();
        }
    }

    public MyViewModel()
    {
        // populate Items
        Items = new ObservableCollection<string>()
        {
            "hello", "bye", "ciao"
        };
    }

    // skipping INotifyPropertyChanged implementation for brevity
}

In your XAML, you then need to set the Items as the ItemsSource of the CollectionView via a Binding expression:

<CollectionView
  ItemsSource="{Binding Items}"
  BackgroundColor="Transparent">

    <CollectionView.ItemTemplate>

        <DataTemplate>

            <Image Source="traffic_light.png"/>

        </DataTemplate>

    </CollectionView.ItemTemplate>
    
</CollectionView>

This also requires that you set the BindingContext of the page in the code-behind:

public partial class TopicsPage : ContentPage
{
    public TopicsPage()
    {
        InitializeComponent();
        BindingContext = new MyViewModel();
    }
}

Upvotes: 0

Related Questions