DataGrid и колонка с ComboBox. Сбрасывается выбор

Подскажите что я сделал не так?

Приложение имеет коллекцию с разделами. Раздел содержит коллекцию свойств, устанавливаемых при помощи выпадающего списка. (для каждого раздела пункты выпадающего списка свои)

При поочередном выборе разделов выбор пунктов выпадающего списка Сбрасывается, хотя в списке доступных пунктов - они присутствуют.

По какой то причине при выборе нового раздела в ListBox (экземпляра класса ListElementClass), в свойства предыдущего раздела записывается null (при этом если бы пункты для обоих разделов были бы одинаковые все бы сработало правильно) Анимация работы

XAML состоит из ListBox для разделов и DataGrid с DataGridTemplateColumn для выбора свойств.

<ListBox HorizontalAlignment="Left" Width="256"
    ItemsSource="{Binding ListElementCollection}" 
    SelectedItem="{Binding SelectedListElement, Mode=TwoWay}"
    DisplayMemberPath="Name" Margin="0,0,0,1"/>
<DataGrid Margin="261,0,0,0" 
    ItemsSource="{Binding SelectedListElement.ItemCollectoinForListElement}"
    AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False"  SelectionMode="Single">
    <DataGrid.Columns>
        <DataGridTemplateColumn Width="*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding Path=DataContext.ComboBoxFiltredItemsCollection, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"
                        DisplayMemberPath="Name"
                        SelectedValue="{Binding Path=Val, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Схема классов

Код для определяющий привязанные данные:

// Выбранный раздел
public ListElementClass SelectedListElement {get; set;}
// Коллекция всех разделов
public ObservableCollection<ListElementClass> ListElementCollection {get;}


// Полная коллекция пунктов выпадающего списка
ObservableCollection<ComboItemClass> comboBoxAllItemsCollection; //"заполняем пунктами 1 раз в конструкторе"
// Фильтрованная коллекция пунктов выпадающего списка
public ReadOnlyObservableCollection<ComboItemClass> ComboBoxFiltredItemsCollection
{
    get
    {
        return new ReadOnlyObservableCollection<ComboItemClass>(
            new ObservableCollection<ComboItemClass>(this.comboBoxAllItemsCollection.Where(x => x.Key == this.SelectedListElement.Key).OrderBy(x => x.Name))
        );
    }
}


// Событие изменения свойств MainVM
private void MainVM_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    //если выбран новый раздел
    if (e.PropertyName == nameof(this.SelectedListElement)) OnPropertyChanged(nameof(this.ComboBoxFiltredItemsCollection)); //обновление фильтрованного списка пунктов
}

Классы данных:

// Класс определяющий данные для Раздела
public class ListElementClass
{
    public int Key { get; }
    public string Name { get; }
    public ObservableCollection<SelectedItemClass> ItemCollectoinForListElement { get; }
}


// Класс содержащий значение выбранного пункта
public class SelectedItemClass : INotifyPropertyChanged
{
    public ComboItemClass Val{get; set;}
}


// Класс определяющий Пункт для выпадающего списка
public class ComboItemClass
{
    public int Key { get; }
    public string Name { get; }
}

Скачать проект


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