SearchBar в С#(mvvm)

113
22 июня 2019, 20:20

Хочу сделать 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)
    {
    }
}
}
Answer 1

В функции 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);

READ ALSO
Проблема с добавлением таблицы в word

Проблема с добавлением таблицы в word

Пытаюсь добавить таблицу между двух параграфовНе получается

140
Как проверить большое целое число на четность или нечетность?

Как проверить большое целое число на четность или нечетность?

Написал программку, которая считывает с textbox число и проверяет его на четность и не четностьПрограмма работает, все норм, НО, выскакивает...

131
Как изменить дату по умолчанию в DatePicker wpf

Как изменить дату по умолчанию в DatePicker wpf

подскажите пожалуйста, как убрать дату DatePicker wpf по умолчанию которая: 0101

122
Unable to find an entry point named &#39;glCreateShader&#39; in DLL &#39;opengl32.dll&#39;

Unable to find an entry point named 'glCreateShader' in DLL 'opengl32.dll'

Пытаюсь загрузить свой ШейдерИспользую Tao

106