2013-06-05 4 views
0

MVVM Light에서 AutoCompleteBox를 사용하는 가장 좋은 방법을 이해하려고합니다.MVVM Light에서 AutoCompleteBox를 사용하는 방법은 무엇입니까?

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"/> 

나는 두 가지 문제점이있다.

일단 내가 결과를 얻으면 자동 완성 영역에 어떻게 표시합니까?

한 번에 여러 요청을 수행하는 것을 어떻게 지연시킬 수 있습니까? 보시다시피 3자를 입력하기 전에 서버를 치고 싶지는 않지만 공정한 게임입니다. 첫 번째 요청이 대역폭 낭비로 이어지기 전에 20 개의 요청이 서버에 수행되는 것과 같은 걱정입니다.

답변

1

KeyDown (영문) 이벤트 또는 그 유사 항목을 사용하고 있다고 가정합니다. 그건 당신이 원하는 방식이 아닙니다. 대신 AutoCompleteBoxPopulating 이벤트를 바인딩하고 AutoCompleteBoxMinimumPrefixLength을 3으로 설정하여 Populating이 3 자 이상인 경우에만 해고되도록합니다. 컨트롤에서 검색된 목록을 표시하려면 목록을 ItemsSource 속성에 바인딩해야하고 메서드를 호출해야합니다 (PopulateComeplte()).

내 대답은 여기 Question에서 볼 수 있습니다.

그러나 웹 서비스에서 목록을 표시하기 위해 컨트롤을 트리거하려면 AutoCompleteBox에서 메서드를 호출해야하므로 MVVM과 관련이 없습니다. 이 article에서 MVVM 친화적 인 접근법을 보시고 "보너스 : MVVM 친화적 인 비동기 필터링"섹션으로 스크롤하십시오.

+0

죄송 합니다만 keyDown 이벤트가 표시되었다고 생각했지만 나중에 사용하고 있습니다. 나는 그것을 확인하고 그것이 어떻게되는지 보게 될 것이다. – chobo2