Not sure if this is what you are looking for. I did something similar, when the user starts typing I was refreshing the list that was being displayed to the user. Not sure if its really what your looking for but it worked for me.
/// <summary>
/// Views the did load.
/// </summary>
public override void ViewDidLoad()
{
base.ViewDidLoad();
_searchBar = new UISearchBar(new RectangleF(0, 0, 320, 44))
{
AutocorrectionType = UITextAutocorrectionType.Yes
};
_searchBar.SearchButtonClicked += SearchBar_SearchButtonClicked;
_searchBar.TextChanged += SearchBarOnTextChanged;
_searchBar.CancelButtonClicked += SearchBarOnCancelButtonClicked;
var source = new MvxSimpleTableViewSource (TableView, SpeciesListCellView.Key, SpeciesListCellView.Key);
var set = this.CreateBindingSet<SpeciesListView, SpeciesListViewModel> ();
set.Bind(source).To(vm => vm.Species);
set.Apply ();
TableView.RowHeight = 50;
TableView.Source = source;
TableView.TableHeaderView = _searchBar;
TableView.ReloadData ();
}
Then I wired up the handlers
/// <summary>
/// Searches the bar on cancel button clicked.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="eventArgs">The <see cref="EventArgs"/> instance containing the event data.</param>
private void SearchBarOnCancelButtonClicked(object sender, EventArgs eventArgs)
{
((SpeciesListViewModel)ViewModel).SearchSpecieByText(string.Empty);
BeginInvokeOnMainThread(() => _searchBar.ResignFirstResponder());
}
/// <summary>
/// Searches the bar on text changed.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="UISearchBarTextChangedEventArgs"/> instance containing the event data.</param>
private void SearchBarOnTextChanged(object sender, UISearchBarTextChangedEventArgs e)
{
if (string.IsNullOrWhiteSpace(_searchBar.Text))
{
((SpeciesListViewModel)ViewModel).SearchSpecieByText(string.Empty);
BeginInvokeOnMainThread(() => _searchBar.ResignFirstResponder());
}
else
{
((SpeciesListViewModel)ViewModel).SearchSpecieByText(_searchBar.Text);
}
}
/// <summary>
/// Handles the SearchButtonClicked event of the SearchBar control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
private void SearchBar_SearchButtonClicked(object sender, EventArgs e)
{
((SpeciesListViewModel)ViewModel).SearchSpecieByText(_searchBar.Text);
BeginInvokeOnMainThread(() => _searchBar.ResignFirstResponder());
}
Then in my ViewModel i was just refreshing the list, making sure you keep a full copy of the original list.
/// <summary>
/// Searches the specie by text.
/// </summary>
/// <param name="text">The text.</param>
public void SearchSpecieByText(string text)
{
if (string.IsNullOrWhiteSpace(text))
Species = FullSpeciesList;
else
{
Species = FullSpeciesList;
Species = Species.Where(m => m.Name.ToLowerInvariant().Contains(text.ToLowerInvariant())).ToList();
}
}
and then property Species would then call the RaisePropertyChanged method