加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows-runtime – Win 8.1 SearchBox – 绑定建议

发布时间:2020-12-14 02:03:52 所属栏目:Windows 来源:网络整理
导读:我们正在编写一个使用新的SearchBox XAML控件的 Windows 8.1 Store应用程序.它似乎是将建议输入下拉列表的唯一方法,因为用户键入的是使用SearchBoxSuggestionsRequestedEventArgs并从事件中获取SearchSuggestionCollection,然后将建议附加到该列表. 我们正在
我们正在编写一个使用新的SearchBox XAML控件的 Windows 8.1 Store应用程序.它似乎是将建议输入下拉列表的唯一方法,因为用户键入的是使用SearchBoxSuggestionsRequestedEventArgs并从事件中获取SearchSuggestionCollection,然后将建议附加到该列表.

我们正在使用Prism for WinRT,并希望将ViewBox和它的事件从获取建议字符串列表的ViewModel中分离出来.

我无法找到将字符串列表绑定到SearchSuggestionCollection或以编程方式添加它们的任何方式,这些方法不涉及使用事件args,这使得单元测试变得非常复杂.

有没有办法绑定/添加不涉及事件args的建议?

解决方法

好的,所以我对这个问题很着迷,这里是使用SearchBox的解决方案.我在 MSDN和 GitHub上传了一份完整的样本

简而言之,使用Behavior SDK和InvokeCommand,然后使用转换器通过使用新属性InputConvert和InputConverterParameter来获取所需的任何数据.

XAML:

<SearchBox SearchHistoryEnabled="False" x:Name="SearchBox" Width="500" Height="50">
        <SearchBox.Resources>
            <local:SearchArgsConverter x:Name="ArgsConverter"/>
        </SearchBox.Resources>
        <interactivity:Interaction.Behaviors>
            <core:EventTriggerBehavior EventName="SuggestionsRequested">
                <core:InvokeCommandAction
                    Command="{Binding SuggestionRequest}"
                    InputConverter="{StaticResource ArgsConverter}"
                    InputConverterLanguage="en-US"
                    InputConverterParameter="{Binding ElementName=SearchBox,Path=SearchHistoryEnabled}"/>
            </core:EventTriggerBehavior>
        </interactivity:Interaction.Behaviors>
    </SearchBox>

转换器:

public sealed class SearchArgsConverter : IValueConverter
{
    public object Convert(object value,Type targetType,object parameter,string language)
    {
        var args = (SearchBoxSuggestionsRequestedEventArgs)value;
        var displayHistory = (bool)parameter;

        if (args == null) return value;
        ISuggestionQuery item = new SuggestionQuery(args.Request,args.QueryText)
        {
            DisplayHistory = displayHistory
        };
        return item;
    }

    public object ConvertBack(object value,string language)
    {
        return value;
    }
}

Mainpade代码隐藏 – 当然你想要在VM中:)

public sealed partial class MainPage
{
    public DelegateCommand<string> Search { get; set; }
    public DelegateCommand<ISuggestionQuery> SuggestionRequest { get; set; }

    public MainPage()
    {
        InitializeComponent();
        Search = new DelegateCommand<string>(SearchedFor,o => true);
        SuggestionRequest = new DelegateCommand<ISuggestionQuery>(SuggestionRequestFor,o => true);

        DataContext = this;
    }

    private void SuggestionRequestFor(ISuggestionQuery query)
    {
        IEnumerable<string> filteredQuery = _data
            .Where(suggestion => suggestion.StartsWith(query.QueryText,StringComparison.CurrentCultureIgnoreCase));
        query.Request.SearchSuggestionCollection.AppendQuerySuggestions(filteredQuery);
    }

    private readonly string[] _data = { "Banana","Apple","Meat","Ham" };

    private void SearchedFor(string queryText)
    {
    }
}

我在博客上写了一篇完整的文章,但以上就是你真正需要的:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读