Откуда берется System.StackOverflowException?

Есть такая модель:

public class ValuableItem<TSource,TValue>:INotifyPropertyChanged
{
    private TValue _value;

    public TValue Value
    {
        get => _value;
        set
        {
            _value = value;
            OnPropertyChanged();
        }
    }

    public TSource Item { get; set; }

    public ValuableItem(TSource item)
    {
        Item = item;
    }

    public event PropertyChangedEventHandler? PropertyChanged;

    [Annotations.NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Во вьюхе у меня есть такой код:

  public INormalizeService SelectedNormalizeService
    {
        get => _selectedNormalizeService;
        set
        {
            _selectedNormalizeService = value;
            var fieldBindings= SelectedNormalizeService?
                .NormalizeAlgorithmDescriptions
                .Where(x => x.IsColumnMapping)
                .Select(x => new ValuableItem<NormalizeAlgorithmDescription, ColumnDescription>(x)).ToList();
            fieldBindings.ForEach(x=>x.PropertyChanged+=OnBindingPropertyChanged);
            FieldBindings = fieldBindings;

            Params = SelectedNormalizeService?
                .NormalizeAlgorithmDescriptions
                .Where(x => !x.IsColumnMapping)
                .Select(x => new ValuableItem<NormalizeAlgorithmDescription, string>(x)).ToList();

            OnPropertyChanged();
            OnPropertyChanged(nameof(FieldBindings));
            OnPropertyChanged(nameof(Params));
        }
    }

    private void OnBindingPropertyChanged(object? sender, PropertyChangedEventArgs e)
    {
        var availableColumns = (ObservableCollection<ColumnDescription>) AvailableColumns;
        availableColumns.Clear();
        //_columnDescriptions.Where(x => FieldBindings.All(f => f.Value != null && f.Value.ColumnName != x.ColumnName))
        //        .ToList().ForEach(x => availableColumns.Add(x));
    }

XAML:

 <StackPanel>
                    <Label>Настройка привязок результата работы алгоритма</Label>
                    <ListView MinHeight="100" ItemsSource="{Binding FieldBindings}" SelectedItem="{Binding SelectedBinding}" >
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <UniformGrid >
                                    <Label Content="{Binding Item.Name}" MinWidth="200"></Label>
                                    <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=StackPanel},
                                        Path=DataContext.AvailableColumns}" DisplayMemberPath="ColumnName"
                                              SelectedItem="{Binding Value}">
                                    </ComboBox>
                                </UniformGrid>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                    <Button Height="20" Command="{Binding Test}"></Button>
                </StackPanel>

Так вот, я вылетаю в OnBindingPropertyChanged в месте вызова Clear. Не могу понять в чем может быть проблема... Вроде, рекурсии никакой нету.

По задумке, элемент списка должен сообщить VM'у об изменении и после этого он должен удалить использованные элементы из общего пула в ComboBox


Ответы (0 шт):