Wpf 仅加载ListView中的少数项目,但使所有项目都可在CollectionView筛选器中搜索

Wpf 仅加载ListView中的少数项目,但使所有项目都可在CollectionView筛选器中搜索,wpf,mvvm,Wpf,Mvvm,我有一个ListView,它需要显示大量的行(大约40000行),并且有一个通过文本框实现的过滤器,用户可以在这个文本框中搜索并找到ListView中的项目。但我只想在listview中显示几行(大约1000行),但要通过过滤器搜索整个40000多行。 显示所有40000行对我来说没有任何意义,因为在UI中加载和呈现这些行需要很多时间。我宁愿只显示几行开始,让用户搜索他们需要的内容 下面是我使用过滤器实现ListView的代码 XAML: <StackPanel Orientation=

我有一个ListView,它需要显示大量的行(大约40000行),并且有一个通过文本框实现的过滤器,用户可以在这个文本框中搜索并找到ListView中的项目。但我只想在listview中显示几行(大约1000行),但要通过过滤器搜索整个40000多行。
显示所有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; }
}