ListView salta o no se encoge

Primero tuvo el problema con el colapso de Expander al no devolver espacio.
Según los bordes, parece ser que ListView no se está reduciendo, en lugar de que Expander no se está reduciendo.
El siguiente código solucionó el problema de la contracción.
DesdeEl control ListBox no encoge
Esto pierde la virtualización, pero estoy de acuerdo con eso, ya que es la cantidad de datos que necesito mostrar.

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

Pero entonces un nuevo problema.
Si abre cualquiera de los dos niveles de Expansor e intenta hacer clic en la casilla de verificación, a menudo saltará y algunas veces saltará tanto que al hacer clic en la casilla de verificación.
Desplácese hasta la parte inferior para que la casilla de verificación no se encuentre en la parte inferior (hay algunos expansores debajo).
Luego haga clic y saltará y lo más probable es que incluso se pierda el elemento.
Puedo hacer varios intentos para marcar o desmarcar la última fila.
Bastante seguro de que esto se debe a que el clic se procesa dos veces y las cosas se mueven entre ellas.

Entonces, ¿cómo solucionar ambos problemas?
1. ¿Contraer / encoger / devolver espacio?
2. ¿La casilla de verificación no salta?

Se intentó actualizar mediante dispatcher, UpdateLayout (), InvalidateVisual () y Height = Double.NaN.
El StackPanel no es el problema, ya que puedo eliminarlo y usar solo Exp1 y seguir teniendo el problema.
Tuve un problema similar antes al hacer doble clic con SelectedItem que pude solucionar al comerme el segundo clic, pero esa solución no funciona aquí.Error al hacer click
Probé TreeView pero no estoy mostrando la misma información en cada nivel, por lo que no funciona.
Pero estoy abierto a otro enfoque.
Jerarquía de dos niveles y solo necesita casillas de verificación en el segundo nivel.

Lo siento por mucho código, pero este es un programa completo para reproducir el problema.
Exp1 es idéntico a Exp2 y no es realmente necesario para reproducir el problema, pero refleja el programa real en caso de que alguien sugiera una solución alternativa.

<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; }
    }
}

Creo que hay dos errores aquí.
El control no se reduce y un clic se procesa dos veces.
Me encogería añadiría gastos generales, pero aún así, ¿por qué no una opción.

Respuestas a la pregunta(1)

Su respuesta a la pregunta