我怎样才能让shell.searchandler推送自己的文本?

时间:2019-10-22 12:27:37

标签: xamarin xamarin.forms

我试图将文本从 Shell.SearchHandler 推送到命令。

我已经使用 SearchBar 构建了它,但是我需要它在 Shell.SearchHandler

中工作
<Shell.SearchHandler >        
 <SearchHandler  x:Name="searchBar"
               Placeholder="Search..."
               Command="{Binding PerformSearch}" 
               CommandParameter="{Binding Text, Source={x:Reference searchBar}}" TextColor="Black" BackgroundColor="LightGray" />
 </Shell.SearchHandler>

在我的View模型中

    public ICommand PerformSearch => new Command<string>((string query) =>
    {
      //do work
    });

该命令确实执行,但查询参数始终为空。

如何获取输入到searchandler中的文本以发布到绑定命令中?

1 个答案:

答案 0 :(得分:0)

  

CommandParameter =“ {绑定文本,源= {x:参考searchBar}}”

按如下方式查看 SearchHandler reference 文档:

  • 查询,类型为字符串,用户在搜索框中输入了文字。

原因是SearchHandler不包含Text属性。您应该将其替换为 Query ,然后它才能工作。

<Shell.SearchHandler >        
 <SearchHandler  x:Name="searchBar"
               Placeholder="Search..."
               Command="{Binding PerformSearch}" 
               CommandParameter="{Binding Query, Source={x:Reference searchBar}}" 
               TextColor="Black" 
               BackgroundColor="LightGray" />
 </Shell.SearchHandler>

注意:如果需要,Custom a SearchHandler也可以监视查询更改。

创建一个MySearchHandler

public class MySearchHandler : SearchHandler
{
    protected override void OnQueryChanged(string oldValue, string newValue)
    {
        base.OnQueryChanged(oldValue, newValue);

        if (string.IsNullOrWhiteSpace(newValue))
        {
            ItemsSource = null;
        }
        else
        {
            Console.WriteLine("search string " + newValue);
            // here you can add code to deal with the viewmodel 
            //ItemsSource = MonkeyData.Monkeys
            .Where(monkey => monkey.Name.ToLower().Contains(newValue.ToLower()))
            .ToList<Animal>();
        }
    }
}

Xaml中:

<ContentPage ...
             xmlns:controls="clr-namespace:Xaminals.Controls">
    <Shell.SearchHandler>
        <controls:MonkeySearchHandler Placeholder="Enter search term"
                                      ShowsResults="true"
                                      DisplayMemberName="Name" />
    </Shell.SearchHandler>
    ...
</ContentPage>

这里有the official sample供参考,这需要一些时间进行研究。