Как отфильтровать ListView, используя панель поиска из кода сзади (MVVM) - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть ListView, который вы хотите отфильтровать с помощью SearchBar

gui

В настоящее время список заполняется из конструктора (шаг параметра) моегоViewModel следующим образом

// AGREGAR SUSTANCIA VIEW MODEL

    List<AgregarSustancia> listaSustanciasAux;

     ObservableCollection<AgregarSustancia> listaSustancias;

      public ObservableCollection<AgregarSustancia> ListaSustancias
      {
           get
           {
              return listaSustancias;
           }
           set
           {
             if (listaSustancias != value)
             {
                  listaSustancias = value;
                   PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ListaSustancias)));
             }
          }
        }

         public AgregarSustanciaViewModel(ObservableCollection<AgregarSustancia> listaAgregarSustancia)
         {

               ListaSustancias = new ObservableCollection<AgregarSustancia>();
               listaSustanciasAux = new List<AgregarSustancia>();

               listaSustanciasAux = listaAgregarSustancia.ToList();
               ListaSustancias = listaAgregarSustancia;
         }

public ICommand SearchCommand
        {
            get
            {
                return new RelayCommand(Search);
            }
        }

        void Search()
        {

                if (string.IsNullOrEmpty(Filter))
                {
                    ListaSustancias = new ObservableCollection<AgregarSustancia>(listaSustanciasAux.OrderBy(o => o.NombreSustancia).OrderByDescending(r => r.IdSustancia));
                }
                else
                {
                    ListaSustancias = new ObservableCollection<AgregarSustancia>(listaSustanciasAux.Where(c => c.IdSustancia.ToString().ToLower().
                                       Contains(Filter.ToLower()) || c.NombreSustancia.ToLower().RemoveDiacritics().Contains(Filter.ToLower())).OrderByDescending(r => r.IdSustancia));
                }

        }

Как видите, я управляю двумя списками с целью обновления списка, связанного с ListView, по мере ввода текста вSearchBar.

Проблема в том, что я не могу сделать это из моей ViewModel, так как каждый элемент списка имеет команду (на Коммутаторе), которая выполняется каждый раз, когда я ввожу символ в SearchBar, поэтомуЯ решил реализовать поиск в Кодексе следующим образом:

// AGREGAR SUSTANCIAS VIEW

 <SearchBar
         x:Name="searchBar"
         TextChanged="SearchBar_TextChanged">
 </SearchBar>

      <ListView
                    x:Name="listView"
                    ItemsSource="{Binding ListaSustancias}"
                    SelectedItem="{Binding SelectedSustancia}">                      
                     <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <StackLayout Orientation="Horizontal" 
                                                 VerticalOptions="CenterAndExpand" 
                                                 Padding="16,5,0,5">

                                    <StackLayout Orientation="Vertical">

                                          <Label Text="{Binding NombreSustancia}" 
                                               HorizontalOptions="FillAndExpand" 
                                               FontSize="Small" 
                                               TextColor="{StaticResource das.color.texto}"
                                               VerticalOptions="CenterAndExpand"/>

                                    </StackLayout>

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

// CODE BEHIND

    public AgregarSustanciaView()
    {
       InitializeComponent();
    }

   private void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
   {
     var search = sender as SearchBar;
   }

Как видно изНа следующем рисунке я фиксирую текст, введенный в строку поиска

value

Но как я могу получить доступ к своему списку и затем отфильтровать его по linq? Как я могу получить доступ из своего кода позади моего связанного списка ViewModel?

Как я могу отфильтровать список, когда символы вводятся в панель поиска? Любая помощь для меня?

1 Ответ

0 голосов
/ 08 ноября 2019

Во-первых, вы должны добавить поведение в ваш проект. https://docs.microsoft.com/tr-tr/xamarin/xamarin-forms/app-fundamentals/behaviors/creating

Затем вы можете использовать это так:

<SearchBar>
            <SearchBar.Behaviors>
                <behaviour:EventToCommandBehavior EventName="TextChanged" Command=" {Binding TextChangedCommand}" />
            </SearchBar.Behaviors>
</SearchBar>



  public ICommand TextChangedCommand => new Command((o) =>
        {
            if (o is TextChangedEventArgs text)
            {
            //do some works
            }
        });

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

<SearchBar x:Name="searchBar"   
                       SearchCommand="{Binding MyFilterCommand}"
                       SearchCommandParameter="{Binding Text, Source={x:Reference searchBar}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...