Панель поиска Xamarin с MVVM

Существует довольно много статей о том, как использовать 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

Панель поиска Xamarin с MVVM

Это потому, что метод, который обрабатывает поиск в моем представлении модели, ожидает 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.


27
1

Ответ:

Решено

просто заверните его в try/catch, чтобы перехватить исключение, или попробуйте это

async Task On_Search_Text_Changed(object keyword)
{
   if (keyword is string) 
   {
     ...
   }
}