Хочу сделать searchbar для поиска людей по имени или фамилии, но всё никак не получается. Вот код... PersonListViewModel.cs:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Text;
using System.Windows.Input;
using Xamarin.Forms;
using GenTree.Views;
using System.Linq;
using GenTree.Models;
namespace GenTree.ViewModels
{
public class PersonsListViewModel : INotifyPropertyChanged
{
public ObservableCollection<MainViewModel> Persons { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
public ICommand CreatePersonCommand { protected set; get; }
public ICommand DeletePersonCommand { protected set; get; }
public ICommand SavePersonCommand { protected set; get; }
public ICommand BackCommand { protected set; get; }
public ICommand SelectPersonsCommand { protected set; get; }
MainViewModel selectedPerson;
public INavigation Navigation { get; set; }
public PersonsListViewModel()
{
Persons = new ObservableCollection<MainViewModel>();
CreatePersonCommand = new Command(CreatePerson);
DeletePersonCommand = new Command(DeletePerson);
SavePersonCommand = new Command(SavePerson);
BackCommand = new Command(Back);
//SelectPersonsCommand = new Command(SelectPersons); попытка сделать поиск
}
public MainViewModel SelectedFriend
{
get { return selectedPerson; }
set
{
if (selectedPerson != value)
{
MainViewModel tempPerson = value;
selectedPerson = null;
OnPropertyChanged("SelectedPerson");
Navigation.PushAsync(new PersonPage(tempPerson));
}
}
}
protected void OnPropertyChanged(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
private void CreatePerson()
{
Navigation.PushAsync(new PersonPage(new MainViewModel() { ListViewModel = this }));
}
private void Back()
{
Navigation.PopAsync();
}
private void SavePerson(object personObject)
{
MainViewModel person = personObject as MainViewModel;
if (person != null && person.IsValid)
{
Persons.Add(person);
}
Back();
}
private void DeletePerson(object personObject)
{
MainViewModel person = personObject as MainViewModel;
if (person != null)
{
Persons.Remove(person);
}
Back();
}
//private void SearchCommandExecute()
//{
// var tempRecords = Persons.Where(p => p.Name.Contains(Text));
// Persons = new ObservableCollection<Person>(tempRecords);
//}
}
}
Relatives.xaml:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage Title="Relatives" Icon="family.png" BackgroundColor="LemonChiffon" xamarinforms:BottomBarPageExtensions.TabColor="#20b2aa"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:xamarinforms="clr-namespace:BottomBar.XamarinForms;assembly=BottomBar.XamarinForms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:GenTree.ViewModels"
x:Class="GenTree.Views.Relatives">
<!--<ContentPage.BindingContext>
<local:MainViewModel/>
</ContentPage.BindingContext>-->
<StackLayout>
<SearchBar x:Name="MainSearchBar"
SearchButtonPressed="MainSearchBar_SearchButtonPressed"/>
<Button Text="Add" Command="{Binding CreatePersonCommand}" />
<ListView x:Name="booksList" ItemsSource="{Binding Persons}"
SelectedItem="{Binding SelectedPerson, Mode=TwoWay}" HasUnevenRows="True">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.View>
<StackLayout>
<Label Text="{Binding Name}" FontSize="Medium" />
<Label Text="{Binding Surname}" FontSize="Small" />
</StackLayout>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
Relatives.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using GenTree.ViewModels;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace GenTree.Views
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class Relatives : ContentPage
{
public Relatives ()
{
InitializeComponent ();
BindingContext = new PersonsListViewModel(){ Navigation = this.Navigation};
}
private void MainSearchBar_SearchButtonPressed(object sender, EventArgs e)
{
}
}
}
В функции SearchCommandExecute() вы создаете новую коллекцию, поэтому чтобы элементы отображались в ListView
вам необходимо уведомить, что коллекция была изменена.
ObservableCollection
уведомляет только об изменении внутри коллекции.
Можно сделать вот так:
private ObservableCollection<MainViewModel> _persons;
public ObservableCollection<MainViewModel> Persons
{
get => _person;
set
{
_person = value;
OnPropertyChanged("Persons");
}
}
И второй способ. Чтобы постоянно не пере-инициализировать коллекцию, добавьте вот такой метод расширения для ObservableCollection
:
public static class ObservableCollectionExtension
{
public static void AddNewRange<T>(this ObservableCollection<T> collection, IEnumerable<T> _collection)
{
if (_collection == null) throw new ArgumentNullException("New collection is empty");
collection.Clear();
foreach (var i in _collection) collection.Add(i);
}
}
Далее используете это в функции SearchCommandExecute()
:Persons.AddNewRange(tempRecords);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Пытаюсь добавить таблицу между двух параграфовНе получается
Написал программку, которая считывает с textbox число и проверяет его на четность и не четностьПрограмма работает, все норм, НО, выскакивает...
подскажите пожалуйста, как убрать дату DatePicker wpf по умолчанию которая: 0101
Пытаюсь загрузить свой ШейдерИспользую Tao