0

我有一个 ListView 需要显示大量行(想想大约 40,000+),并通过一个文本框实现了一个过滤器,用户可以在其中搜索和查找 ListView 中的项目。但我想在 listview 中只显示几行(大约 1000 行),但通过过滤器使整个 40,000+ 行可搜索。
显示所有 40,000 行对我来说没有任何意义,这需要花费大量时间在 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; }
}
4

0 回答 0