2013-11-20 2 views
5

Мы пишем приложение для Windows 8.1 Store, в котором используется новый элемент управления SearchBox XAML. Он выглядит как единственный способ получить предложения в раскрывающемся списке, поскольку пользовательские типы - это использовать SearchBoxSuggestionsRequestedEventArgs и получить SearchSuggestionCollection из события, а затем добавить предложения к этому.Win 8.1 SearchBox - обязательные предложения

Мы используем Prism для WinRT и хотим отделить SearchBox и его события от ViewModel, которые получают список строк предложений.

Я не могу найти в любом случае привязки списка строк к SearchSuggestionCollection или любым способом их добавления программно, что не связано с использованием аргументов событий, что очень сложно сделать модульное тестирование.

Есть ли способ привязки/добавления предложений, которые не связаны с событиями args?

+0

Im на моем телефоне, так плохо, добавьте это как комментарий вместо ответа. Взгляните на EventToCommand в MVVM Light. То, что было сделано в подобной ситуации. плохо захватить мой компьютер и собрать пример позже, но если вы спешите, это должно дать вам начало. –

+0

Вы его отсортировали? –

ответ

8

Хорошо, поэтому я одержим этим вопросом, и вот решение для использования 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, 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-и т.д. / –

Смежные вопросы