Существует довольно много статей о том, как использовать Xamarin SearchBar
с шаблоном MVVM. Проблема в том, что все эти статьи привязывают событие PerformSearch
к команде MVVM.
Я думаю, что в наши дни большинство пользователей ожидают увидеть некоторые результаты по мере ввода, а не после того, как они нажмут «Поиск». Итак, я попытался использовать Xamarin Community Toolkit EventToCommandBehavior
, чтобы связать событие TextChanged
с моей командой MVVM. Это выглядит так:
<SearchBar
x:Name = "CompanySearch"
Placeholder = "Search companies..."
PlaceholderColor = "#777777"
BackgroundColor = "{StaticResource PrimaryBackground}"
TextColor = "{StaticResource SecondaryDark}">
<SearchBar.Behaviors>
<xct:EventToCommandBehavior
EventName = "TextChanged"
Command = "{Binding SearchTextChanged}"
CommandParameter = "{Binding Text, Source = {x:Reference CompanySearch}}"/>
</SearchBar.Behaviors>
</SearchBar>
Это прекрасно работает, пока пользователь не нажмет «Отмена» на iOS. Затем приложение вылетает со следующей ошибкой:
Invalid type for parameter. Expected Type System.String, but received Type Xamarin.Forms.TextChangedEventArgs
Это потому, что метод, который обрабатывает поиск в моем представлении модели, ожидает string
, который выглядит так:
async Task On_Search_Text_Changed(string keyword)
{
if (!string.IsNullOrEmpty(keyword) && keyword.Length > 3)
{
var data = await _myApi.CompanySearch(keyword);
if (data != null && data.Count > 0)
Suggestions = new ObservableRangeCollection<CompanyModel>(data);
}
}
Есть идеи, как обрабатывать событие отмены с помощью EventToCommandBehavior
? Я также открыт для другого подхода, пока я могу выполнять поиск по TextChanged
, а НЕ по PerformSearch
.