Wpf 仅加载ListView中的少数项目,但使所有项目都可在CollectionView筛选器中搜索
我有一个ListView,它需要显示大量的行(大约40000行),并且有一个通过文本框实现的过滤器,用户可以在这个文本框中搜索并找到ListView中的项目。但我只想在listview中显示几行(大约1000行),但要通过过滤器搜索整个40000多行。Wpf 仅加载ListView中的少数项目,但使所有项目都可在CollectionView筛选器中搜索,wpf,mvvm,Wpf,Mvvm,我有一个ListView,它需要显示大量的行(大约40000行),并且有一个通过文本框实现的过滤器,用户可以在这个文本框中搜索并找到ListView中的项目。但我只想在listview中显示几行(大约1000行),但要通过过滤器搜索整个40000多行。 显示所有40000行对我来说没有任何意义,因为在UI中加载和呈现这些行需要很多时间。我宁愿只显示几行开始,让用户搜索他们需要的内容 下面是我使用过滤器实现ListView的代码 XAML: <StackPanel Orientation=
显示所有40000行对我来说没有任何意义,因为在UI中加载和呈现这些行需要很多时间。我宁愿只显示几行开始,让用户搜索他们需要的内容 下面是我使用过滤器实现ListView的代码 XAML:
<StackPanel Orientation="Horizontal" Width="Auto" Grid.Column="0">
<StackPanel Orientation="Vertical" >
<StackPanel Orientation="Horizontal" Margin="0">
<Label Name="lblFilter" Content="Search"></Label>
<TextBox Name="txtFilter" Text="{Binding LdapFilter,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="450">
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<i:InvokeCommandAction Command="{Binding FilterTextChangedCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
<Button Content="Clear" Command="{Binding ClearCommand}" IsEnabled="{Binding CancelButtonEnabled}" FontSize="22" Margin="5" Foreground="White" Background="Maroon"></Button>
</StackPanel>
<ListView x:Name="LdapList" Height="Auto" SelectionMode="Multiple" Width="Auto" Focusable="False" ScrollViewer.VerticalScrollBarVisibility="Auto" VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling" IsSynchronizedWithCurrentItem="True"
ScrollViewer.CanContentScroll="True" ItemsSource="{Binding EmailListCollection}" >
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="BorderBrush" Value="#FFB8B8B8" />
<Setter Property="BorderThickness" Value="0,0,0,2" />
<Setter Property="Padding" Value="5,5,5,5"></Setter>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="#FFA7372B" />
</Trigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="Email-ID" DisplayMemberBinding="{Binding EmailId,Mode=TwoWay}" Width="100"></GridViewColumn>
<GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName,Mode=TwoWay}" Width="100"></GridViewColumn>
<GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName,Mode=TwoWay}" Width="100"></GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</StackPanel>
</StackPanel>
public CollectionViewSource viewSource;
public ObservableCollection<Person> emailList = new ObservableCollection<Person>();
public ObservableCollection<Person> EmailList
{
get { return emailList; }
set
{
if (value != emailList)
{
emailList = value;
emailSelected = null;
OnPropertyChanged("EmailLIst");
}
}
}
private string ldapFilter;
public string LdapFilter
{
get { return ldapFilter; }
set
{
if (value != ldapFilter)
{
ldapFilter = value;
this.viewSource.View.Refresh();
//FilterResults();
OnPropertyChanged("LdapFilter");
}
}
}
private string emailSelected;
public string EmailSelected
{
get { return emailSelected; }
set
{
if (value != emailSelected)
{
emailSelected = value;
OnPropertyChanged("EmailSelected");
}
}
}
public ICollectionView EmailListCollection
{
get
{
return this.viewSource.View;
}
}
public RelayCommand<object> SelectedItemChangedCommand { get; set; }
public MainViewModel()
{
using (var context = new dbEntities())
{
var list = context.DataList.Where(s => s.EmailAddress != null).ToList();
foreach (var item in list)
{
EmailList.Add(new Person
{
ID = item.ID,
EmailId = item.EmailAddress,
FirstName = item.FirstName,
LastName = item.LastName
});
}
viewSource = new CollectionViewSource();
viewSource.Source = EmailList;
viewSource.Filter += ViewSource_Filter;
}
}
private void ViewSource_Filter(object sender, FilterEventArgs e)
{
if (string.IsNullOrEmpty(LdapFilter))
{
e.Accepted = true;
return;
}
else
{
if (((e.Item as Person).EmailId != null && (e.Item as Person).EmailId.ToUpper().Contains(LdapFilter.ToUpper())) ||
((e.Item as Person).FirstName != null && (e.Item as Person).FirstName.ToUpper().Contains(LdapFilter.ToUpper())) ||
((e.Item as Person).LastName != null && (e.Item as Person).LastName.ToUpper().Contains(LdapFilter.ToUpper())))
e.Accepted = true;
else
e.Accepted = false;
}
}
public class Person
{
public int ID { get; set; }
public string EmailId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}