Откуда берется 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