2011-01-10 61 views
2

我一直在使用WPF工具包中的AutoCompleteBox,它只是滿足我所有的需求,除了這個麻煩的ValueMemberPath綁定。這是建議框自動完成的值。AutoCompleteBox中的ValueMemberPath綁定WPF只返回姓氏搜索中的頂級結果?

因此,我有這個姓氏字段,當用戶開始輸入姓氏時,我會根據該信息動態檢索前10個結果。但是,如果用戶鍵入'Smith'並選擇列表中的第4個名稱,則始終會檢索建議列表中的第一個結果,因爲ValueMemberPath設置爲按LastName篩選。它總是認爲即使有50名不同名字的史密斯,「史密斯」也是第一個結果。

我一直在試圖弄清楚如何將這個屬性的名字與頭腦混在一起。我試圖將ValueMemberPath更改爲FullName字段,該字段等於姓氏和名字。建議框會在輸入逗號時立即停止排序,或者如果它是名字「空格」姓也不起作用。

我也遇到了與ValueMemberPath問題,因爲這一數值能不能動態地改變,並且有錯誤的地方是空的同時調試:AutoCompleteBox Bug : ValueMemberPath is Null

我明白如果沒有人有完整的解決方案。我只是想我會問這個問題,以防萬一將來遇到這個問題,我不知道如何處理這個問題。

回答

5

這是AutoCompleteBox中的一個錯誤。在控件內部,ValueMemberPathValueMemberBinding屬性使用名爲BindingEvaluator的類型實現。此類是FrameworkElementAutoCompleteBox用於執行間接值綁定。

問題是,當BindingEvaluator與邏輯樹斷開連接時,綁定不起作用。這裏是AutoCompleteBox需要如何以管理其BindingEvaluator爲它工作:

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    DataContext = new { FirstName = "Bill", LastName = "Smith" }; 
    var valueBindingEvaluator = new BindingEvaluator<string>(); 
    AddLogicalChild(valueBindingEvaluator); 
    valueBindingEvaluator.ValueBinding = new Binding("FirstName"); 
    var value = valueBindingEvaluator.GetDynamicValue(DataContext); 
} 

這是一個非常簡單的錯誤修復,如果你願意重新編譯WPF工具包你自己。

public Binding ValueMemberBinding 
{ 
    get 
    { 
     return _valueBindingEvaluator != null ? 
      _valueBindingEvaluator.ValueBinding : null; 
    } 
    set 
    { 
     if (_valueBindingEvaluator == null) 
     { 
      _valueBindingEvaluator = new BindingEvaluator<string>(); 
      AddLogicalChild(_valueBindingEvaluator); 
     } 
     _valueBindingEvaluator.ValueBinding = value; 
    } 
} 

這也修復了您鏈接到的錯誤。

+0

非常感謝你,我不確定我會得到這個答案。我對WPF來說很新,所以我在這裏有一點點不足。必須將WPF工具包轉換爲2010年,並且正在挖掘,發現第二個功能,但不是第一個功能。 – Drew 2011-01-11 13:37:07