2013-11-20 23 views
5

Yeni SearchBox XAML denetimini kullanan bir Windows 8.1 Mağaza Uygulaması yazıyoruz. Kullanıcı türleri, SearchBoxSuggestionsRequestedEventArgs'ı kullanmak ve olaydan SearchSuggestionCollection'ı almak ve sonra önerileri eklemek için açılan listeye öneriler almanın tek yolu gibi görünüyor.Win 8.1 SearchBox - ciltleme önerileri

WinRT için Prism kullanıyoruz ve SearchBox ve olaylarını öneri dizelerinin listesini alan ViewModel'den ayırmak istiyoruz.

Zaten SearchSuggestionCollection ya da çok karmaşık birim testi dışarı yapıyor olay args kullanarak içermeyen programlama ekleyerek herhangi şekilde dizeleri listesini bağlanmasının bulamıyorum.

Olay arşivlerini içermeyen önerileri eklemenin/eklemenin bir yolu var mı?

+0

Telefonumda bu yüzden bu mesajı yanıt yerine yorum olarak ekleyin. MVVM Light'da EventToCommand'a bir göz atın. Thats benzer bir durumda ne yaptım. hasta bilgisayarımı tut ve daha sonra bir örnek oluştur, ama aceleniz varsa, bu size bir başlangıç ​​vermelidir. –

+0

Sıralandı mı? –

cevap

8

Tamam, bu yüzden bu soruya takıntılı oldum, ve burada Arama Kutusu'nu kullanırken bir çözüm. Ben, Kısacası MSDN ve GitHub

üzerinde tam örnek yüklenen Davranış SDK ve ve InvokeCommand kullanın ve ardından yeni özelliklerini InputConvert ve InputConverterParameter kullanarak ne gerekiyorsa veri kapmak için bir dönüştürücü kullanın ettik.

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> 

Dönüştürücü:

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 - tabii ki bir VM içinde istiyorum :)

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

uçtan uca tam bir yürüyüş yukarı yazdım benim blogum, ama yukarıdaki gerçekten ihtiyacınız olan her şey :)

+0

Bazıları bundan hoşlanmadığı için cevabımda blog'uma bağlantı kurmak istemedim, ancak şu adresten geçiyor: http://irisclasson.com/2013/12/10/passing-event-arguments-from- xaml-in-pencereleri-store-uygulamalar-inputconverter-inputconverterparameter-etc / –