我需要处理WPF应用程序中的大量数据。
我已将大型集合绑定到ListView,并且我使用ItemContainerStyle
将列表项的IsSelected属性与我的对象的IsSelected
属性绑定,以便在{中选择项目时{1}},我的对象'ListView
属性也将设置为true。通过执行此操作,我可以轻松地仅对列表中已选择的对象执行命令。
我在ListView中使用UI虚拟化,因为该应用程序会缓慢。但是因为我的整个集合中只有一部分在列表中可见,所以当我使用CTRL + A选择列表中的所有项时,只有加载的项将IsSelected
属性设置为true。不可见的项目(虚拟化的项目)将其IsSelected
属性设置为false。这是一个问题,因为当我选择列表中的所有项目时,我希望集合中所有项目的IsSelected
属性都设置为true。
我已经创建了一些示例代码来说明问题:
MainWindow.xaml
IsSelected
MainWindow.xaml.cs
<Window x:Class="VirtualizationHelp.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" x:Name="wnd">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Grid.Row="0" Content="Click me" Click="Button_Click" />
<ListView Grid.Row="1" ItemsSource="{Binding Path=Persons, ElementName=wnd}">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
</Grid>
</Window>
单击表单顶部的按钮时,它会计算集合中“IsSelected”属性设置为true的项目。您可以看到,当您按 CTRL + A 选择列表中的所有项目时,它会显示只选择了19个项目。
有没有人知道解决这个问题的方法?我无法关闭虚拟化,因为我会得到可怕的性能。
答案 0 :(得分:3)
我认为这是你的约束力。基本上你正在更新/绑定ListViewItem,它只会更新可见的,而不是整个列表。我会玩它,现在你可以解析代码绑定..
<Window x:Class="VirtualizationHelp.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" x:Name="wnd">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock x:Name="txtSelectedItemsCount"/>
<ListView Grid.Row="1" ItemsSource="{Binding Path=Persons, ElementName=wnd}"
SelectionChanged="ListView_SelectionChanged"/>
</Grid>
</Window>
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var lv = (ListView) sender;
txtSelectedItemsCount.Text = lv.SelectedItems.Count.ToString();
}