Windows runtime Win 8.1搜索框-绑定建议

Windows runtime Win 8.1搜索框-绑定建议,windows-runtime,winrt-xaml,Windows Runtime,Winrt Xaml,我们正在编写一个使用新的SearchBox XAML控件的Windows 8.1应用商店应用程序。在用户输入时,将建议放入下拉列表的唯一方法似乎是使用SearchBoxSuggestionRequestedEventArgs并从事件中获取SearchSuggestionCollection,然后将建议附加到该列表中 我们正在使用Prism for WinRT,希望将搜索框及其事件与获取建议字符串列表的ViewModel分开 我找不到任何将字符串列表绑定到SearchSuggestionColle

我们正在编写一个使用新的SearchBox XAML控件的Windows 8.1应用商店应用程序。在用户输入时,将建议放入下拉列表的唯一方法似乎是使用SearchBoxSuggestionRequestedEventArgs并从事件中获取SearchSuggestionCollection,然后将建议附加到该列表中

我们正在使用Prism for WinRT,希望将搜索框及其事件与获取建议字符串列表的ViewModel分开

我找不到任何将字符串列表绑定到SearchSuggestionCollection的方法,也找不到任何不使用事件参数的编程方式添加字符串,这使得单元测试非常复杂


有没有一种方法可以绑定/添加不涉及事件args的建议?

好的,所以我一直困扰着这个问题,下面是使用SearchBox时的一个解决方案。我已经在和上上传了完整的示例

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

XAML:

Mainpade codebehind-当然,您希望在VM中使用它:)

公共密封部分类主页面
{
公共DelegateCommand搜索{get;set;}
公共DelegateCommand SuggestionRequest{get;set;}
公共主页()
{
初始化组件();
Search=新的DelegateCommand(SearchedFor,o=>true);
SuggestionRequest=newdelegateCommand(SuggestionRequestFor,o=>true);
DataContext=this;
}
私有void SuggestionRequestFor(issuggestionquery)
{
IEnumerable filteredQuery=\u数据
.Where(suggestion=>suggestion.StartsWith(query.QueryText,
StringComparison.CurrentCultureInogoreCase);
query.Request.SearchSuggestionCollection.AppendQuerySuggestions(filteredQuery);
}
私有只读字符串[]_data={“香蕉”、“苹果”、“肉”、“火腿”};
专用void SearchedFor(字符串queryText)
{
}
}

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

Im在我的手机上,所以我会把它作为评论而不是回答。从MVVM的角度来看EventToCommand。这就是我在类似情况下所做的。稍后,我会抓起我的电脑,整理一个例子,但如果你很忙,这应该会给你一个开始。你把它整理好了吗?我不想在答案中链接到我的博客,因为有些人不喜欢,但下面是一个演练:
    <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, Type targetType, object parameter, string language)
    {
        return value;
    }
}
 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)
    {
    }
}