reven102
reven102

Reputation: 35

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).

Upvotes: 1

Views: 123

Answers (1)

Wendy Zang - MSFT
Wendy Zang - MSFT

Reputation: 10978

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

Upvotes: 1

Related Questions