2013-11-20 29 views
5

我們正在編寫一個使用新的SearchBox XAML控件的Windows 8.1商店應用程序。它看起來像獲取建議到下拉列表中的唯一方法是使用SearchBoxSuggestionsRequestedEventArgs並從事件中獲取SearchSuggestionCollection,然後將建議附加到該建議。Win 8.1 SearchBox - 綁定建議

我們使用Prism for WinRT,並希望將ViewBox和ViewModel中的事件分開,以獲取建議字符串列表。

我找不到將字符串列表綁定到SearchSuggestionCollection或以任何方式通過編程方式添加它們,而不涉及使用事件參數,這使得單元測試非常複雜。

有沒有一種方法來綁定/添加不涉及事件參數的建議?

+0

林在我的手機上如此生病添加此評論,而不是答案。查看MVVM Light中的EventToCommand。這就是類似情況下所做的。不好意思抓住我的電腦,稍後再舉一個例子,但如果你很着急,這應該給你一個開始。 –

+0

您是否對它進行排序? –

回答

8

好吧,所以我迷上了這個問題,這裏是使用SearchBox時的解決方案。我對MSDNGitHub

上傳了全樣本總之,使用行爲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, Type targetType, object parameter, string language) 
    { 
     return value; 
    } 
} 

Mainpade代碼隱藏 - 當然你想這個在一個虛擬機:)

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) 
    { 
    } 
} 

我通過上寫了一個完整的步行我的博客,但以上是你真正需要的:)

+0

不想鏈接到我的博客的答案,因爲有些不喜歡,但這裏是漫步:http://irisclasson.com/2013/12/10/passing-event-arguments-from- XAML式窗口,商店的應用程序,inputconverter-inputconverterparameter-等/ –

相關問題