GroupedCollection导致无限循环

时间:2018-08-30 10:42:28

标签: c# xamarin

我的代码中有一个无限循环,我尝试调试了几个小时。我试图从代码中删除InitGroupData,并且一切正常,但是它不能重新添加我删除的项目。

我要尝试的是,如果enabledBrand为false,则从列表中删除项目,如果为true,则重新添加它们。我这样做的方法是清除InitGroupData中的列表,然后再次将它们全部重新添加,如果属实,则不删除它们。

除非我启用了InitGroupData,否则在Grouped.Add和NotifyPropertyChanged之后会触发infininityloop。

public void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

 private void RemoveSubBrandsToHideInUi()
        {
            InitGrouppedData();
            foreach (Grouping<CategoryViewModel, CategoryViewModel> category in GroupedItems)
            {
                if (category.Key.IsEnabledBrand == false)
                {
                    for (int i = category.Count - 1; i >= 0; i--)
                    {
                        category.RemoveAt(i);
                    }
                }
            }
        }

输出错误消息

[0:] Binding: CategoryViewModel can not be converted to type 'System.String'

这是集合,类别列表是我在构造函数中附加侦听器的位置。

public ObservableCollection<Grouping<CategoryViewModel, CategoryViewModel>> GroupedItems { get; set; }

public List<CategoryViewModel> Categories { get; set; }

  public void AttachListener()
        {
            foreach (var groupuedproduct in Categories)
            {
                groupuedproduct.PropertyChanged += UpdateBrandList;
            }
        }

        private void UpdateBrandList(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "IsEnabledBrand")
            {
                RemoveSubBrandsToHideInUi();
            }
        }

这是无限循环发生的地方。在底部,出于某种原因,groupeditems.add会触发我的NotifyPropertyChanged,并将e.Property设为IsEnabledBrand。

public void InitGrouppedData()
        {
            GroupedItems.Clear();
            foreach (CategoryViewModel category in Categories)
            {
                List<CategoryViewModel> subCategory = new List<CategoryViewModel>();
                if (category.Subcategories != null)
                {
                    foreach (CategoryViewModel subcategory in category.Subcategories)
                    {
                        subCategory.Add(subcategory);
                    }
                }

                Grouping<CategoryViewModel, CategoryViewModel> group = new Grouping<CategoryViewModel, CategoryViewModel>(category, subCategory);

                GroupedItems.Add(group);
            }
        }
    }

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

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

}

0 个答案:

没有答案