带有 MVVM 的 Xamarin 搜索栏

Xamarin Searchbar with MVVM

关于如何使用 Xamarin SearchBar 和 MVVM 模式的文章很多。问题是所有这些文章都将 PerformSearch 事件绑定到 MVVM 命令。

我想现在,大多数用户都希望在键入时看到一些结果,而不是在点击“搜索”后看到结果。因此,我尝试使用 Xamarin 社区工具包的 EventToCommandBehaviorTextChanged 事件绑定到我的 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.

上执行搜索,我也愿意接受另一种方法

只需将其包装在 try/catch 中以捕获异常,或者试试这个

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