У меня есть ListView, который вы хотите отфильтровать с помощью SearchBar
В настоящее время список заполняется из конструктора (шаг параметра) моего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;
}
Как видно изНа следующем рисунке я фиксирую текст, введенный в строку поиска
Но как я могу получить доступ к своему списку и затем отфильтровать его по linq? Как я могу получить доступ из своего кода позади моего связанного списка ViewModel?
Как я могу отфильтровать список, когда символы вводятся в панель поиска? Любая помощь для меня?