グリッドを表示する仮想化された ListView を使用したこの XAML フォームがあります。
<Window x:Class="WpfVirtualList.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">
<Window.Resources>
<Style x:Key="lvStyle" TargetType="{x:Type ListView}">
<Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
<Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/>
<Setter Property="ScrollViewer.IsDeferredScrollingEnabled" Value="True"/>
<Setter Property="ListView.ItemsSource" Value="{Binding}"/>
<Setter Property="ListView.View">
<Setter.Value>
<GridView>
<GridViewColumn Header="Cups" Width="200">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding CUPS}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="MeterId" Width="150">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding MeterID}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Matricula" Width="100">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding MatriculaCT}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsLoading}" Value="True">
<Setter Property="ListView.Cursor" Value="Wait"/>
<Setter Property="ListView.Background" Value="LightGray"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<ListView x:Name="lv" HorizontalContentAlignment="Stretch" Style="{DynamicResource lvStyle}" SelectionChanged="lv_SelectionChanged" />
</Grid>
</Window>
そして、アイテムを選択すると、すべてが正常に機能します...
しかし、2 番目のアイテムを選択すると、システムは StackOverflow をスローします...なぜなのかわかりません。
すべての仮想リスト メソッドにブレークポイントがありますが、2 番目の項目をクリックしても、いずれのメソッドも呼び出されません。
SelectionChanged イベントにブレークポイントがあり、どちらも呼び出されません。
//CUPS is the id
private void lv_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(e.RemovedItems.Count > 0)
Debug.WriteLine("selected: "+((ItemClass)e.RemovedItems[0]).CUPS);
if(e.AddedItems.Count > 0)
Debug.WriteLine("unselected: " + ((ItemClass)e.AddedItems[0]).CUPS);
}
GotFocus イベントを制御し、すべての選択を解除して修正しましたが、これはこれを解決する方法ではありません。
private void lv_GotFocus(object sender, RoutedEventArgs e)
{
lv.UnselectAll();
}