2011-11-07 3 views
1

도메인 서비스의 항목을 쿼리하여 ObservableCollection ItemsSource에 바인드 된 AutoCompleteBox가 있습니다. PopulatingEventArgs.Cancel을 True로 설정하여 Jeff Wilcox의 블로그에서 웹 서비스 호출로 채우는 시나리오를 사용했고 컬렉션이 준비되면 ACB에서 PopulateComplete()를 호출합니다.Webservice에서 제안을 다시로드하지 않고 Silverlight AutoCompleteBox 팝업을 다시 엽니 다.

목표는 마우스 오버시 (또는 클릭) 드롭 다운을 다시 열지 만 웹에서 모든 데이터를 다시로드하지 않는 것입니다. 대답은 IsDropDownOpen을 True로 설정하는 것이었던 stackoverflow에 관한 질문을 발견했습니다. 그러나이 경우 ACB 인구가 ​​다시 시작되고 다른 전화가 웹 서비스로 연결됩니다.

물론 사용자가 타이핑을 시작하면 필터링을 다시 수행해야합니다. (예 : "ric"을 입력하고 상자에 "rice"및 "ricin"이 표시되면 쌀을 선택하지만 마음이 바뀌고 같은 컬렉션에서 다른 단어를 선택하려는 경우 "ricin"이라고 말하십시오. 메모리에 "ric"이 포함 된 제안이 이미 있습니다. 다시로드 할 필요가 없습니다.)

IsDropDownOpen을 설정하는 대신 PopulateComplete() 메소드를 호출하는 다른 방법이 있습니다. 이것은 내가 원하는 것과 똑같은 일을하지만 조금만 실패하면 ACB가 포커스를 잃은 후에 드롭 다운이 마우스 오버시에 다시 열리지 않습니다. 심지어 acb 텍스트 상자를 다시 클릭 할 때도 마찬가지입니다.

이 문제가 수정되었거나 ACB에 처음 포커스가있을 때 PopulateComplete() 만 드롭 다운을 다시 여는 이유를 아는 사람이 있습니까? 또는이 메서드를 호출하면 내 드롭 다운이 다시 열리고 해당 IsDropDownOpen 속성을 대신 사용해야합니다 (afaik이 일부 플래그를 사용하여 해당 가짜 populating 이벤트 내 mouseover 및 PopulatingEventArgs.Cancel 호출해야합니다 즉시 PopulateComplete하지만.이 작동하지 않을 경우 (아직 시도하지 않은), PopulateComplete 단순히 호출 할 때 왜?

답변

1

글쎄, 나는 테스트 비트와 IsDropDownOpen을 시도하고, 거의 일 :

public void FoodBox_Populating(object sender, PopulatingEventArgs e) 
    { 
     e.Cancel = true;    
     if (!testbit) 
     { 
      VM.LoadFoodSuggestions(FoodBox.SearchText); 
     } 
     else 
     { 
      testbit = false; 
      FoodBox.PopulateComplete(); 
     } 
    } 
:

여기
private void FoodBox_MouseEnter(object sender, MouseEventArgs e) 
    {    
     //FoodBox.PopulateComplete(); not working after acb loses focus...    

     testbit = true; 
     FoodBox.IsDropDownOpen = true;   
    } 

가 오버로드 채우기 방법 (때문에 바인딩 된 ObservableCollection에 명시 적 ItemsSource을 설정할 필요가 없습니다)입니다

이것은 좋은 결과를 가져 오며, 처음 마우스 포인터를 놓고 acb를 선택하면 testbit가 true로 설정되기 때문에 검색이 시작되지 않습니다. 그래서 사용자가 키보드로 텍스트를 입력 할 때마다 testbit을 false로 설정하는 다른 이벤트 처리기를 추가하여 사용자가 SearchText를 수정 한 후에 제안 사항을 재생성/다시로드했지만 항목을 선택할 때 다시 생성하지 않도록했습니다. 드롭 다운이 : PopulateComplete을 (호출 이유

private void FoodBox_TextChanged(object sender, RoutedEventArgs e) 
    { 
     testbit = false; 
    } 

난 아직도 충분하지 진짜야에 IsDropDownOpen을 설정하고 true로 그 설정을하지 않고있다) 알 수없는, 또한에 지정된 시간에 약 드롭 다운 개방을 지연 MinimumPopulateDelay,하지만 적어도 내가 원하는 기능을 제공합니다. (어쩌면 acb의 소스를 파헤쳐이 미스터리에 대답 할 것이다)

기본 acb에서 구현 된이 기능은 향후 컨트롤 릴리스에서 유용 할 수도 있습니다.

관련 문제