Два бара поиска Xamarin Forms - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть вопрос здесь (я думаю, что это для начинающих: P).

У меня уже есть просмотр списка и панель поиска. Я могу сделать правильный фильтр.

Тогда у меня возникает вопрос, у этого списка больше одного столбца.

Я не могу придумать, как сделать 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>

С эту структуру я могу реализовать этот ... "фильтр фильтрата"?

спасибо

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Я создаю пример кода для вашей ссылки.

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));
    }
}

enter image description here

0 голосов
/ 03 февраля 2020

Полагаю, что приведенный ниже код подойдет для вас. Вам просто нужно изменить свой код linq в методе FilterItem(string filter), чтобы удовлетворить ваши требования.

Примечание:

Я использовал OR условие внутри условие where для поиска, если введенный текст доступен как в Name, так и в Bairro. Однако вы можете изменить условие по своему усмотрению.

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();
}
...