两个搜索栏 Xamarin Forms

Two search bar Xamarin Forms

这里有个问题(我想是给初学者的:P)。

我有一个列表视图和一个搜索栏已经可以使用了。我可以制作合适的滤镜。

那我的问题来了,这个listview不止一列

我想不出制作 2 个互补滤镜的方法。

例如:

过滤第 1 列,然后按第 2 列(使用另一个搜索栏)过滤初始过滤器的结果,即在另一个过滤器之上的过滤器。

我的 ListViewItem 是这样的过滤器:

C#

void InitList()
{
    Items = new List<ListViewItem>
    {
        new ListViewItem { Name = "Guilherme", Bairro = "BOTAFOGO"},

        new ListViewItem { Name = "João", Bairro = "FLAMENGO"},

        new ListViewItem { Name = "Maria", Bairro = "CENTRO"}
    }
}

void InitSearchBarBloco()
{
    sb_search_bloco.TextChanged += (s, e) => FilterItem(sb_search_bloco.Text);

    sb_search_bloco.SearchButtonPressed += (s, e) => 
        FilterItem(sb_search_bloco.Text);
}

private void FilterItem(string filter)
{
    exampleListView.BeginRefresh();

    if (string.IsNullOrWhiteSpace(filter))
    {
        exampleListView.ItemsSource = Items;
    }
    else
    {
        exampleListView.ItemsSource = Items.Where(x => x.Name.ToLower().Contains(filter.ToLower()));
    }

    exampleListView.EndRefresh();
}

XAML

<SearchBar x:Name="sb_search_bloco" Placeholder="Nome..." />

    <ListView x:Name="exampleListView" RowHeight="22" SelectedItem="{Binding Name}">

        <ListView.ItemTemplate>

            <DataTemplate>

                <ViewCell >

                    <Grid>

                        <Label Text="{Binding Name}" LineBreakMode="TailTruncation" />

                        <Label Grid.Column="1" Text="{Binding Bairro}" />

                    </Grid>

                </ViewCell>

            </DataTemplate>

        </ListView.ItemTemplate>            

</ListView>

有了这个结构我可以实现这个... "filtrate filter"?

谢谢

我想下面的代码应该适合你。您只需要更改 FilterItem(string filter) 方法中的 linq 代码即可实现您的要求。

Note:

I have used OR condition inside the where clause to search if the enter text is available in both Name and Bairro. However, you can modify the condition as you require.

private void FilterItem(string filter)
{
    exampleListView.BeginRefresh();
    if (string.IsNullOrWhiteSpace(filter))
    {
        exampleListView.ItemsSource = Items;
    }
    else
    {
        //Alter the condition like below or based on requirement to achieve the desired result. 
        exampleListView.ItemsSource = Items.Where(x => x.Name.ToLower().Contains(filter.ToLower()) || x.Bairro.ToLower().Contains(filter.ToLower()));
    }
    exampleListView.EndRefresh();
}

我做了一个示例代码供大家参考。

xmal:

<StackLayout>
    <StackLayout>
        <SearchBar x:Name="sb_search_bloco" Placeholder="Nome..." TextChanged="sb_search_bloco_TextChanged"/>
        <SearchBar x:Name="searchBar2" Margin="0,10" TextChanged="searchBar2_TextChanged" />
    </StackLayout>

    <ListView
        x:Name="exampleListView"
        RowHeight="22"
        ItemsSource="{Binding Items}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid>
                        <Label LineBreakMode="TailTruncation" Text="{Binding Name}" />
                        <Label Grid.Column="1" Text="{Binding Bairro}" />
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

ListViewItem.cs

  public class ListViewItem
{
    public string Name { get; set; }

    public string Bairro { get; set; }

}

MainPage.xml.cs

 public partial class MainPage : ContentPage
{
    public List<ListViewItem> Items { get; set; }
    public MainPage()
    {
        InitializeComponent();
        Items = new List<ListViewItem>
        {
              new ListViewItem { Name = "AAAA", Bairro = "BBCFS"},
              new ListViewItem { Name = "ABBB", Bairro = "SSDCA"},
              new ListViewItem { Name = "AAAA", Bairro = "AAAD"},
              new ListViewItem { Name = "CCCC", Bairro = "SSS"},
              new ListViewItem { Name = "DAAB", Bairro = "CCC"},
              new ListViewItem { Name = "DDDC", Bairro = "QWDAS"}
        };
        this.BindingContext = this;
    }

    private void sb_search_bloco_TextChanged(object sender, TextChangedEventArgs e)
    {
        exampleListView.ItemsSource = FilterItem1(e.NewTextValue);
    }

    IEnumerable<ListViewItem> FilterItem1(string filter = null)
    {        

        if (string.IsNullOrEmpty(filter))
            return Items;
        return Items.Where(p => p.Name.StartsWith(filter));
    }

    private void searchBar2_TextChanged(object sender, TextChangedEventArgs e)
    {
        exampleListView.ItemsSource = FilterItem2(e.NewTextValue);
    }
    IEnumerable<ListViewItem> FilterItem2(string filter = null)
    {

        if (string.IsNullOrEmpty(filter))
            return Items;
        return Items.Where(p => p.Bairro.StartsWith(filter));
    }
}