2011-10-07 50 views
2

嗨我使用的是AutoCompleteBox這樣AutoCompleteBox與TextChanged事件沒有選擇正確

<!-- XAML Code --> 
<sdk:AutoCompleteBox Grid.Row="2" 
     FilterMode="None" 
     ItemsSource="{Binding Customers}" 
     SelectedItem="{Binding Path=SelectedCustomer, Mode=TwoWay}" 
     Text="{Binding CustomerSearchString, Mode=TwoWay}" 
     ValueMemberBinding="{Binding Path=FullName}" 
     ValueMemberPath="FullName" 
     TextChanged="{ext:Invoke MethodName=Search, Source={Binding}}"/> 

C#部分:

// Search Method in the viewmodel 
public void Search() 
{ 
    var customerOperation = _context.Load(_context.GetCustomerByNameQuery(CustomerSearchString)); 
    customerOperation.Completed += (s, e) => Customers = new List<Customer>(customerOperation.Entities); 
} 

在我的應用程序快速搜索客戶的快速和簡單的搜索方法。我可以在下拉菜單中正確顯示所有內容,當我用鼠標選擇它時,它可以完美地工作。

但是,當我按下ArrowDown時,您會看到文本出現一瞬間,但之後它會恢復並將光標放回到文本框中,而不是選擇第一個條目。我嘗試過使用TextInput事件,但那個不會觸發。

我怎樣才能避免這種情況?

SOLUTION:

的問題是,當用戶選擇一個條目,創建某種類似行爲的競爭條件,其中的文本得到重置TextChanged事件被解僱了。 解決方案是使用KeyUp事件(不要使用KeyDown,因爲Text屬性將不會更新)。當用戶選擇某些東西解決問題時,不會觸發此事件。

最終代碼(視圖模型不變):

<!-- XAML Code --> 
<sdk:AutoCompleteBox Grid.Row="2" 
     FilterMode="None" 
     ItemsSource="{Binding Customers}" 
     SelectedItem="{Binding Path=SelectedCustomer, Mode=TwoWay}" 
     Text="{Binding CustomerSearchString, Mode=TwoWay}" 
     ValueMemberBinding="{Binding Path=FullName}" 
     ValueMemberPath="FullName" 
     KeyUp="{ext:Invoke MethodName=Search, Source={Binding}}"/> 

謝謝大家!

回答

2

添加處理像這樣的代碼:

KeyEventHandler eventHandler = MyAutoCompleteBox_KeyDown; 
MyAutoCompleteBox.AddHandler(KeyDownEvent, eventHandler, true); 
+0

嘿!謝謝,那幾乎就是解決方案,但是:a)我使用XAML-Markup,因爲我不需要代碼並使用KeyUp,因爲在KeyDown上Text屬性尚未更新。感謝並祝賀50分:D – LueTm

0

我不是...理解爲什麼您使用的是TextChanged事件?那個有什麼用?如果你把它拿出來,它有用嗎?我在我的項目中使用了一個自動完成框,我不需要搜索方法...我所做的只是將對象列表提供給自動完成框,並在用戶輸入時搜索該列表。我可以通過鼠標或上/下箭頭來選擇。我唯一能想到的是,每次嘗試使用向上/向下箭頭時,文本會發生變化並關閉搜索功能,並關閉選擇選項下拉菜單...

+0

我用它來搜索,因爲整個集合不能被RIA Services消化,並且它也會是太多的數據(超過10'000個數據集)。 – LueTm