GroupedCollection вызывает бесконечный цикл - PullRequest
0 голосов
/ 30 августа 2018

В моем коде есть бесконечный цикл, который я пытался отлаживать часами. Я пытался удалить InitGroupData из кода, и все работает, за исключением того, что он не может повторно добавить элемент, который я тогда удалил.

То, что я пытаюсь сделать, это удалить элементы из списка, если enabledBrand имеет значение false, повторно добавить их, когда true. Для этого я очищаю список в InitGroupData и снова добавляю их все, и, если это так, просто не удаляйте их.

За исключением тех пор, пока я включил InitGroupData, он вызывает бесконечный цикл после Grouped.Add с моим NotifyPropertyChanged.

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);
        }
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...