Search code examples
c#androidxamarinxamarin.formscollectionview

CollectinView Grouping doesnt show all Items in the last Group


im working on an Mobile App for Android in Xamarin Forms, and have one problem. I have a ObservableCollection that i fill with the following Model.

    private int _category_ID;
    public int Category_ID
    {
        get
        {
            return _category_ID;
        }
        set
        {
            _category_ID = value;
            OnPropertyChanged("_category_ID");
        }
    }
    private string _category_Name;
    public string Category_Name
    {
        get
        {
            return _category_Name;
        }
        set
        {
            _category_Name = value;
            OnPropertyChanged("_category_Name");
        }
    }
    private string _category_Description;
    public string Category_Description
    {
        get
        {
            return _category_Description;
        }
        set
        {
            _category_Description = value;
            OnPropertyChanged("_category_Description");
        }
    }
    public CategoryModel(string name, List<ProductModel> products) : base(products)
    {
        Category_Name = name;
    }

That works fine and all Categorys and Items shows right when i Debugging in the ObservableCollection. Example: Categroy 1 = 2 Items Category 2 = 3 Items Category 3 = 4 Items. That works.

But my problem is, that when i use a CollectionView like this

      <CollectionView ItemsSource="{Binding ObservCollectionCategory}" IsGrouped="True">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <ScrollView>
                            <Grid Padding="10">
                                <StackLayout BackgroundColor="Blue">
                                    <Label Text="{Binding Product_Name}"/>
                                    <Label Text="{Binding Product_Description}"/>
                                </StackLayout>
                            </Grid>
                            </ScrollView>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                    <CollectionView.GroupHeaderTemplate>
                        <DataTemplate >
                            <Label Text="{Binding Category_Name}"/>
                        </DataTemplate>
                    </CollectionView.GroupHeaderTemplate>
                </CollectionView>

The View shows me only the first item of the last categroy and the other ignores. All other Categorys shows right. When i create a blank Categroy at the end of the ObservableCollection then all Items, from the last category, shows in the View. But i have an empty Group then at the end.

I have try to show me the count in the header, and the count the right one (4).


Solution

  • You could try the code below.

    Model:

     public class ProductModel : INotifyPropertyChanged
    {
    
        private string _product_Name;
        public string Product_Name
        {
            get
            {
                return _product_Name;
            }
            set
            {
                _product_Name = value;
                OnPropertyChanged("Product_Name");
            }
        }
        private string _product_Description;
        public string Product_Description
        {
            get
            {
                return _product_Description;
            }
            set
            {
                _product_Description = value;
                OnPropertyChanged("Product_Description");
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    
    }
    public class CategoryModel : List<ProductModel>, INotifyPropertyChanged
    {
        private string _category_Name;
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        public string Category_Name
        {
            get
            {
                return _category_Name;
            }
            set
            {
                _category_Name = value;
                OnPropertyChanged("Category_Name");
            }
        }
    
        public CategoryModel(string name, List<ProductModel> diary) : base(diary)
        {
            Category_Name = name;
        }
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    Code behind:

    public ObservableCollection<CategoryModel> ObservCollectionCategory { get; set; } = new ObservableCollection<CategoryModel>();
    
        public Page18()
        {
            InitializeComponent();
            ObservCollectionCategory.Add(new CategoryModel("Categroy 1", new List<ProductModel>
            {
                new ProductModel(){ Product_Name="item1", Product_Description="Description1"},
                new ProductModel(){ Product_Name="item2", Product_Description="Description2"},
            }));
            ObservCollectionCategory.Add(new CategoryModel("Categroy 2", new List<ProductModel>
            {
                new ProductModel(){ Product_Name="item1", Product_Description="Description1"},
                new ProductModel(){ Product_Name="item2", Product_Description="Description2"},
                new ProductModel(){ Product_Name="item3", Product_Description="Description3"},
            }));
            ObservCollectionCategory.Add(new CategoryModel("Categroy 3", new List<ProductModel>
            {
                new ProductModel(){ Product_Name="item1", Product_Description="Description1"},
                new ProductModel(){ Product_Name="item2", Product_Description="Description2"},
                new ProductModel(){ Product_Name="item3", Product_Description="Description3"},
                new ProductModel(){ Product_Name="item4", Product_Description="Description4"},
            }));
    
            this.BindingContext = this;
        }
    

    Output:

    enter image description here