2013-06-05 2 views
0

J'essaie de comprendre comment utiliser AutoCompleteBox avec MVVM Light.Comment utiliser AutoCompleteBox avec MVVM Light?

public ICommand AutoComplete 
     { 
      get 
      { 
       return new RelayCommand<KeyEventArgs>(e => 
       { 
        var txtBox = e.OriginalSource as TextBox; 

        if (e.Key == Key.Unknown) 
        { 
         return; 
        } 

        string autoComplete = txtBox.Text + e.Key; 

        if (autoComplete.Length >= 3) 
        { 
         RestClient c = new RestClient("http://localhost:3333/api/store"); 
         RestRequest r = new RestRequest("/GetStoreNames",Method.GET); 
         r.AddParameter("Name", autoComplete); 
         r.AddParameter("Latitude", "49"); 
         r.AddParameter("Longitude", "49"); 
         var d = c.BuildUri(r); 
         c.ExecuteAsync(r, response2 => 
          { 
           var content = response2.Content; 
          }); 
        } 


       }); 
      } 
     } 


    <i:Interaction.Triggers> 
       <i:EventTrigger EventName="KeyUp"> 
        <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding AutoComplete, Mode=OneWay}" PassEventArgsToCommand="True"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 


<toolkit:AutoCompleteBox x:Name="acbStore" Margin="154,196,29,0" VerticalAlignment="Top" RenderTransformOrigin="0.6,0.083" Height="162" MinimumPopulateDelay="500"/> 

J'ai fait ci-dessus, mais il y a quelques problèmes.

Une fois les résultats obtenus, comment les afficher dans la zone d'auto-complétion?

Comment puis-je retarder le traitement de plusieurs requêtes à la fois? Comme vous pouvez le voir, je ne veux pas frapper le serveur avant que 3 caractères soient entrés, mais après cela, c'est un jeu équitable. Je suis un peu inquiet que comme 20 demandes seront faites au serveur avant que la première demande le rend menant à la bande passante gaspillée.

Répondre

1

Je suppose que vous utilisez KeyDown événement ou similaire? Ce n'est pas comme ça que tu veux le faire. Au lieu de cela, liez l'événement AutoCompleteBoxPopulating et définissez le MinimumPrefixLength sur votre AutoCompleteBox à 3 afin que Populating soit renvoyé uniquement lorsque vous avez 3+ caractères. Pour afficher la liste récupérée dans votre contrôle, la liste doit être liée à la propriété ItemsSource, puis une méthode doit être appelée, PopulateComeplte().

Vous pouvez voir ma réponse ici sur un Question similaire.

Cependant, il n'est pas convivial MVVM puisque vous devez appeler une méthode sur votre AutoCompleteBox pour déclencher le contrôle pour afficher la liste de votre service Web. Jetez un oeil à cette article pour une approche conviviale MVVM, faites défiler jusqu'à la section "Bonus: filtrage asynchrone MVVM-friendly".

+0

Ya désolé pensé qu'il a montré l'événement keyDown mais je l'utilise. Je vais vérifier cela et voir comment ça se passe. – chobo2