ListView скачет или не сжимается

Сначала возникла проблема с развалом экспандера, не возвращающего пространство.
Основываясь на границах, кажется, что ListView не сжимается, а Expander не сжимается.
Следующий код исправил проблему сжатия.
ИзЭлемент управления ListBox не сжимается
Это теряет виртуализацию, но я согласен с этим, так как это столько данных, сколько мне нужно для отображения.

<ListView.ItemsPanel>
    <ItemsPanelTemplate>
        <StackPanel/>
    </ItemsPanelTemplate>
</ListView.ItemsPanel>  

Но тогда возникла новая проблема.
Если вы откроете какие-либо два уровня Expander и попытаетесь нажать на флажок, он будет часто прыгать, а иногда прыгать так сильно, что щелчок пропустит флажок.
Прокрутите весь путь вниз, чтобы флажок не был внизу (под ним есть несколько Расширителей).
Затем нажмите, и он будет прыгать и, скорее всего, даже пропустить элемент.
Я могу предпринять несколько попыток проверить или снять отметку с последнего ряда.
Я уверен, что это происходит из-за того, что клик обрабатывается дважды и что-то происходит между ними.

Так как исправить обе проблемы?
1. Свернуть, сжать / вернуть пространство?
2. Флажок не прыгает?

Пробное обновление с помощью диспетчера, UpdateLayout (), InvalidateVisual () и Height = Double.NaN.
StackPanel не является проблемой, так как я могу удалить его и использовать только Exp1, но проблема остается.
У меня была похожая проблема до двойного щелчка с SelectedItem, которую я смог исправить с помощью второго щелчка, но это исправление здесь не работает.Промах курсора
Пробовал TreeView, но я не отображаю ту же информацию на каждом уровне, поэтому он не работает.
Но я открыт для другого подхода.
Двухуровневая иерархия и просто нужны флажки на втором уровне.

Извините за большое количество кода, но это полная программа для воспроизведения проблемы.
Exp1 идентичен Exp2 и не является действительно необходимым для воспроизведения проблемы, но это отражает реальную программу на случай, если кто-то предложит альтернативное решение.

<Window x:Class="ListViewJump.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="165"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <ScrollViewer Grid.Row="0" Grid.Column="0"
                      HorizontalScrollBarVisibility="Disabled"
                      VerticalScrollBarVisibility="Visible">
            <StackPanel>
                <Expander IsExpanded="False" Header="Exp1" BorderThickness="2" BorderBrush="Green">
                    <ListView ItemsSource="{Binding Path=List1}"
                              HorizontalAlignment="Left" BorderThickness="2" BorderBrush="Orange">
                        <ListView.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel/>
                            </ItemsPanelTemplate>
                        </ListView.ItemsPanel>
                        <ListView.ItemTemplate >
                            <DataTemplate>
                                <Expander Header="{Binding Path=DispName}">
                                    <ListView ItemsSource="{Binding Path=Rows}"
                                              HorizontalAlignment="Left" BorderThickness="2" BorderBrush="Purple">
                                        <ListView.ItemTemplate >
                                            <DataTemplate>
                                                <CheckBox Width="125" IsChecked="{Binding Path=On}">
                                                    <TextBlock Text="{Binding Path=StrValue}"  TextWrapping="Wrap"/>
                                                </CheckBox>
                                            </DataTemplate>
                                        </ListView.ItemTemplate>
                                    </ListView>
                                </Expander>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </Expander>
                <Expander IsExpanded="False" Header="Exp2"  BorderThickness="2" BorderBrush="Green">
                    <ListView ItemsSource="{Binding Path=List2}"
                              HorizontalAlignment="Left" BorderThickness="2" BorderBrush="Orange">
                        <ListView.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel/>
                            </ItemsPanelTemplate>
                        </ListView.ItemsPanel>
                        <ListView.ItemTemplate >
                            <DataTemplate>
                                <Expander Header="{Binding Path=DispName}">
                                    <ListView ItemsSource="{Binding Path=Rows}"
                                              HorizontalAlignment="Left" BorderThickness="2" BorderBrush="Purple">
                                        <ListView.ItemTemplate >
                                            <DataTemplate>
                                                <CheckBox Width="125" IsChecked="{Binding Path=On}">
                                                    <TextBlock Text="{Binding Path=StrValue}"  TextWrapping="Wrap"/>
                                                </CheckBox>
                                            </DataTemplate>
                                        </ListView.ItemTemplate>
                                    </ListView>
                                </Expander>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </Expander>
            </StackPanel>
        </ScrollViewer>
    </Grid>
</Window>

namespace ListViewJump
{
    public partial class MainWindow : Window
    {
        private List<ListItem> list1 = new List<ListItem>();
        private List<ListItem> list2 = new List<ListItem>();
        public MainWindow()
        {
            this.DataContext = this;  
            for (int i = 1; i < 10; i++)
            {
                List<ListItemRow> lr1 = new List<ListItemRow>();
                List<ListItemRow> lr2 = new List<ListItemRow>();
                for (int j = 1; j < 100; j++)
                {
                    lr1.Add(new ListItemRow("Row Row Row Row Row Row" + j.ToString()));
                    lr2.Add(new ListItemRow("Rwo Rwo Rwo Rwo Rwo Rwo" + j.ToString()));
                }
                list1.Add(new ListItem("one " + i.ToString(), lr1));
                list2.Add(new ListItem("two " + i.ToString(), lr2));
            }   
            InitializeComponent();                         
        }
        public List<ListItem> List1 { get { return list1; } }
        public List<ListItem> List2 { get { return list2; } }
    }
    public class ListItem
    {
        private string dispName;
        private List<ListItemRow> rows;
        public string DispName { get { return dispName; } } 
        public List<ListItemRow> Rows { get { return rows; } }
        public ListItem(String DispName, List<ListItemRow> Rows) { dispName = DispName; rows = Rows; }
    }
    public class ListItemRow
    {
        private string strValue;
        private bool on = false;
        public string StrValue { get { return strValue; } }
        public bool On
        {
            get { return on; }
            set { on = value; }
        }
        public ListItemRow(String StrValue) { strValue = StrValue; }
    }
}

Я думаю, что здесь есть две ошибки.
Контроль не уменьшается, а клик обрабатывается дважды.
Я получаю сокращение будет добавить накладные расходы, но все же, почему не вариант.

Ответы на вопрос(1)

Ваш ответ на вопрос