2013-11-20 15 views
5

Stiamo scrivendo un'app Store di Windows 8.1 che utilizza il nuovo controllo XAML di SearchBox. Sembra l'unico modo per ottenere suggerimenti nell'elenco a discesa mentre il tipo di utente consiste nell'utilizzare SearchBoxSuggestionsRequestedEventArgs e ottenere SearchSuggestionCollection dall'evento, quindi aggiungere i suggerimenti.Win 8.1 SearchBox - suggerimenti di associazione

Usiamo Prism per WinRT e vogliamo separare SearchBox ed i suoi eventi dal ViewModel che sta ricevendo l'elenco delle stringhe di suggerimento.

Non riesco a trovare comunque l'associazione di un elenco di stringhe a SearchSuggestionCollection o qualsiasi altro modo di aggiungerli in modo programmatico che non implichi l'utilizzo degli argomenti degli eventi, il che sta rendendo molto complesso il test delle unità.

C'è un modo per legare/aggiungere i suggerimenti che non coinvolgono gli argomenti di evento?

+0

Im sul mio telefono così male aggiungilo come commento invece di risposta. Dai un'occhiata a EventToCommand in MVVM Light. Questo è ciò che ho fatto in una situazione simile. mal prese il mio computer e metti insieme un esempio più tardi, ma nel caso tu sia di fretta questo dovrebbe darti un inizio. –

+0

Hai risolto il problema? –

risposta

8

Ok, quindi sono ossessionato da questa domanda e qui è una soluzione per l'utilizzo di SearchBox. Ho caricato un campione completo su MSDN e GitHub

In breve, utilizzare l'SDK comportamento e ed l'InvokeCommand, e quindi utilizzare un convertitore di afferrare qualunque dati necessari utilizzando i nuovi attributi InputConvert e 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> 

Converter:

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 codebehind - naturalmente si desidera che questo in una 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) 
    { 
    } 
} 

ho scritto una passeggiata completa attraverso su il mio blog, ma quanto sopra è tutto ciò di cui hai veramente bisogno :)

+0

Non volevo collegarmi al mio blog nella risposta dato che a qualcuno non piace, ma qui è la passeggiata: http://irisclasson.com/2013/12/10/passing-event-arguments-from- XAML-in-finestre-store-app-convertitore in ingresso-inputconverterparameter-etc / –