2011-11-07 62 views
1

我有一個綁定到ObservableCollection ItemsSource的AutoCompleteBox,我通過查詢domainservice中的實體來自己過濾。 我使用了從Jeff Wilcox博客的webservice調用填充的場景,通過將PopulatingEventArgs.Cancel設置爲True,並且當我的集合準備就緒時,我在ACB上調用PopulateComplete()。重新打開Silverlight AutoCompleteBox彈出窗口,無需從webservice重新加載建議

我的目標是重新打開鼠標懸停(或點擊)上的下拉菜單,但不需要重新從Web上重新載入所有數據。我在Stackoverflow上發現了一個問題,答案是將IsDropDownOpen設置爲True。但在這種情況下,ACB人口再次啓動,另一個呼叫轉到網絡服務。

當然,當用戶開始輸入時,應該再次進行過濾。 (例如,你輸入「ric」,框中顯示「rice」和「ricin」,你選擇大米,但是你改變了主意並想從同一個集合中選擇另一個,可以說「ricin」。如果你已經在內存中包含「ric」的建議,不需要再次加載它們。)

我發現了一種替代IsDropDownOpen的替代方法,我只是簡單地調用PopulateComplete()方法。這和我想要的完全一樣,但有一點失敗:在我的ACB失去焦點後,下拉不會在鼠標懸停時再次打開。即使當我點擊回到acb文本框。

那麼有沒有解決這個問題,或者有人知道爲什麼當ACB第一次聚焦時,PopulateComplete()只會重新打開下拉菜單?或者這只是我的運氣,調用此方法重新打開下拉列表,而應該使用IsDropDownOpen屬性(afaik這將是唯一可能的一些標誌,指示它是由我的鼠標懸停觸發的假填充事件和我應該調用PopulatingEventArgs.Cancel後立即PopulateComplete。但我沒有得到它,如果這可能工作(還沒有嘗試過),爲什麼不簡單時調用PopulateComplete)?

回答

1

嗯,我試過IsDropDownOpen與測試一下,幾乎工作:

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

     testbit = true; 
     FoodBox.IsDropDownOpen = true;   
    } 

下面是重載的填充方法(無需顯式設置的ItemsSource因爲它綁定到一個ObservableCollection):

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

目前爲止效果很好,假設搜索無法啓動,因爲當(第一次)鼠標懸停並選擇acb時,它會將testbit設置爲true。 因此,我添加了另一個事件處理程序,負責在每次用戶在鍵盤上輸入文本時將測試位設置爲false,以確保在用戶修改SearchText後重新生成/重新載入建議,但是當您從中選擇項時下拉:

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

我仍然不知道爲什麼叫PopulateComplete()是不夠的,而不IsDropDownOpen設置爲真實姿態,以及設置爲true,也大約在指定的時間延遲的下拉開幕MinimumPopulateDelay,但至少它給了我想要的功能。 (也許挖掘acb的來源會回答這個神祕的)

也許這個功能在基本的acb中實現將有助於未來版本的控制。

相關問題