Всем добрый день. В настоящее время я делаю приложение, которое позволяет пользователю записывать CRUD-запись о клиенте и сохранять ее в базе данных. Все созданные записи отображаются в ListView.

Что я хочу сделать, так это создать SearchBar, который позволяет мне искать записи клиентов, которые находятся внутри моего ListView. В отдельной программе я попытался создать панель поиска, но мне удалось найти записи только из предварительно определенного ListView.

Панель поиска, которую мне нужно сделать, должна позволять мне искать в ListView, который поступает из базы данных.

Надеюсь, ты поможешь мне с этим.

Вот несколько моих кодов. Если вам нужно увидеть больше. Пожалуйста, дай мне знать. Большое спасибо.

CustomerViewModel.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using XamarinFormsDemo.Models;
using XamarinFormsDemo.Services;

    namespace XamarinFormsDemo.ViewModels
    {
    public class CustomerVM : INotifyPropertyChanged
    {

        private List<Customer> _customerList;


    public List<Customer> CustomerList
    {
        get { return _customerList; }
        set
        {
            _customerList = value;
            OnPropertyChanged();
        }
    }




    public CustomerVM()
    {
        InitializeDataAsync();
    }

    private async Task InitializeDataAsync()
    {
        var customerServices = new CustomerServices();

        CustomerList = await customerServices.GetCustomerAsync();
    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }


    }
}

CustomerPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="XamarinFormsDemo.Views.ClientListPage"
         xmlns:ViewModels="clr-namespace:XamarinFormsDemo.ViewModels;assembly=XamarinFormsDemo"
         xmlns:controls="clr-namespace:ImageCircle.Forms.Plugin.Abstractions;assembly=ImageCircle.Forms.Plugin.Abstractions"
         BackgroundImage="bg3.jpg"
         Title="Client List">


  <ContentPage.BindingContext>
    <ViewModels:CustomerVM/>
  </ContentPage.BindingContext>


  <StackLayout Orientation="Vertical">



    <ListView x:Name="CustomerListView"
          ItemsSource="{Binding CustomerList}"
          HasUnevenRows="True">
      <ListView.ItemTemplate>
        <DataTemplate>
         <ViewCell>
            <Grid Padding="10" RowSpacing="10" ColumnSpacing="5">
              <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
              </Grid.RowDefinitions>
              <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
              </Grid.ColumnDefinitions>

              <controls:CircleImage Source="icon.png"
                 HeightRequest="66"
                 HorizontalOptions="CenterAndExpand"
                 Aspect="AspectFill"
                 WidthRequest="66"
                 Grid.RowSpan="2"
               />


              <Label Grid.Column="1"
                 Text="{Binding CUSTOMER_NAME}"
                 TextColor="#24e97d"
                 FontSize="24"/>



          <Label Grid.Column="1"
                  Grid.Row="1"
                   Text="{Binding CUSTOMER_CODE}"
                   TextColor="White"
                   FontSize="18"
                   Opacity="0.6"/>


          <Label Grid.Column="1"
              Grid.Row="2"
              Text="{Binding CUSTOMER_CONTACT}"
               TextColor="White"
               FontSize="18"
               Opacity="0.6"/>



        </Grid>
      </ViewCell>
    </DataTemplate>
  </ListView.ItemTemplate>

</ListView>


<StackLayout Orientation="Vertical"
         Padding="30,10,30,10"
         HeightRequest="20"
         BackgroundColor="#24e97d"
         VerticalOptions="Center"
         Opacity="0.5">
  <Label Text="© Copyright 2016   SMESOFT.COM.PH   All Rights Reserved "
         HorizontalTextAlignment="Center"
         VerticalOptions="Center"
         HorizontalOptions="Center" />
    </StackLayout>
  </StackLayout>



</ContentPage>
0
Jaycee Evangelista 8 Июл 2016 в 11:15
Попробуйте использовать ObservableCollection вместо List
 – 
Yehor Hromadskyi
8 Июл 2016 в 11:59
Где я должен это положить? Решит ли это мою проблему, сэр?
 – 
Jaycee Evangelista
8 Июл 2016 в 12:06
С public List<Customer> CustomerList на public ObservableCollection<Customer> CustomerList. Также не вижу SearchBar и логики поиска.
 – 
Yehor Hromadskyi
8 Июл 2016 в 12:24
Это не решило мою проблему, сэр. Потому что мое внимание на самом деле сосредоточено на том, как я буду искать записи в ListView. Записи, которые поступают из базы данных и не определены заранее.
 – 
Jaycee Evangelista
8 Июл 2016 в 12:45

2 ответа

Лучший ответ

SearchBar имеет свойство SearchCommand. Привяжите его к какой-нибудь модели просмотра ICommand. Также привяжите свойство Text объекта SearchBar к свойству string в модели представления. Храните все записи в какой-либо общей коллекции _allCustomers и в интерфейсе отображайте только ObservableCollection<Customer> Customers. В методе выполнения этой команды вы можете добавить:

private void SearchCommandExecute()
{
    var tempRecords = _allCustomers.Where(c=>c.FullName.Contains(Text));
    Customers = new ObservableCollection<Customer>(tempRecords);
}
3
Yehor Hromadskyi 8 Июл 2016 в 14:36
Как я могу привязать свойство Text панели поиска к строке в viewmodel?
 – 
Jaycee Evangelista
13 Июл 2016 в 13:23
<SearchBar Text={Binding TextOnViewModelPropertyName, Mode=TwoWay}>
 – 
Yehor Hromadskyi
13 Июл 2016 в 14:23
У меня есть этот код в XAML: Правильно ли я поступаю? Как я буду использовать код ICommand в SearchCommand? Я не использую наблюдаемую коллекцию, потому что она плохо работает. Это мой текущий код в модели просмотра: pastie.org/10906667
 – 
Jaycee Evangelista
14 Июл 2016 в 05:59
Вы должны привязать Text of SearchBar к свойству string в модели представления, а не к List. ICommand - это тип. Поэтому лучший способ - привязать SearchCommand из SearchBar к свойству типа ICommand в модели представления. Что не так с ObservableCollection?
 – 
Yehor Hromadskyi
14 Июл 2016 в 09:49
Я предлагаю вам изучить статьи, связанные с разработкой Xamarin.Forms, например.
 – 
Yehor Hromadskyi
14 Июл 2016 в 10:30

По сути, это дополнение к ответу Егора Громадского, но, поскольку комментариев по другим темам очень много, я размещаю его здесь.

Имейте в виду, что когда на панели поиска нажимается кнопка X или кнопка отмены, команда поиска не запускается. Поэтому, если вы хотите показать все результаты по этому событию, вызовите эту команду из свойства SearchText (в этом случае SearchText имеет значение null, по крайней мере, на iOS, для Android см. этот форум ).

То же самое можно сделать, если вы хотите выполнять поиск по мере ввода и не дожидайтесь нажатия кнопки поиска.

public string SearchText
{
  get { ... }
  set { 
        ... = value;
        SearchCommand.Execute();
      }
}
0
Maxim Zabolotskikh 15 Мар 2017 в 13:40