В моем коде есть бесконечный цикл, который я пытался отлаживать часами. Я пытался удалить 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);
}
}
}
}