Всем добрый день. В настоящее время я делаю приложение, которое позволяет пользователю записывать 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>
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);
}
<SearchBar Text={Binding TextOnViewModelPropertyName, Mode=TwoWay}>
Text
of SearchBar
к свойству string
в модели представления, а не к List
. ICommand
- это тип. Поэтому лучший способ - привязать SearchCommand
из SearchBar
к свойству типа ICommand
в модели представления. Что не так с ObservableCollection
?
По сути, это дополнение к ответу Егора Громадского, но, поскольку комментариев по другим темам очень много, я размещаю его здесь.
Имейте в виду, что когда на панели поиска нажимается кнопка X или кнопка отмены, команда поиска не запускается. Поэтому, если вы хотите показать все результаты по этому событию, вызовите эту команду из свойства SearchText (в этом случае SearchText имеет значение null, по крайней мере, на iOS, для Android см. этот форум ).
То же самое можно сделать, если вы хотите выполнять поиск по мере ввода и не дожидайтесь нажатия кнопки поиска.
public string SearchText
{
get { ... }
set {
... = value;
SearchCommand.Execute();
}
}
Похожие вопросы
Новые вопросы
xaml
Расширяемый язык разметки приложений (XAML) - это декларативный язык на основе XML, используемый для инициализации структурированных значений и объектов в различных средах. Когда вопрос касается использования XAML с конкретной платформой, следует также предоставить тег для этой платформы, например, [wpf] (Windows Presentation Foundation), [silverlight], [windows-phone], [windows-store-apps] (приложения магазина Windows 8), [win-universal-app], [xamarin.forms] или [workflow- Фонд]
ObservableCollection
вместоList
public List<Customer> CustomerList
наpublic ObservableCollection<Customer> CustomerList
. Также не вижуSearchBar
и логики поиска.