2011-01-10 16 views
2

私はWPF ToolkitでAutoCompleteBoxを使用しています。これは、この厄介なValueMemberPathバインディングを除いて、すべてのニーズを満たしています。これは、提案ボックスが自動的に完了する値です。ValueMemberPath AutoCompleteBoxでのバインドWPFは、姓の検索で一番上の結果を返しますか?

私はこの姓フィールドを持っています。ユーザーが姓で入力を開始すると、それに基づいて上位10個の結果が動的に取得されます。しかし、ユーザが 'Smith'と入力してリストの4番目の名前を選択すると、でフィルタするように設定されているため、常に候補リストの最初の結果が取得されます。最初の名前が異なる50のスミスがあっても、常に「スミス」が最初の結果だと思うだけです。

私はこのプロパティにファーストネームを組み込む方法を理解しようとしている私の頭を悩ましています。私はValueMemberPathを姓、名字と等しいFullNameフィールドに変更しようとしました。提案ボックスは、コンマが入力されるとすぐに並べ替えを停止するか、またはどちらも機能しないファーストネームの「スペース」ラストネームである場合は停止します。

この値を動的に変更することはできませんので、私はまたValueMemberPathの問題に走った、とデバッグ中にそれがnullでバグがあります:AutoCompleteBox Bug : ValueMemberPath is Nullが。

誰も完全な解決策がない場合は、私は理解します。私はちょうど人々が将来これに遭遇し、これをどう対処するか分からない場合に質問をすると思った。

答えて

5

これはAutoCompleteBoxのバグです。コントロールの内部では、BindingEvaluatorというタイプを使用して、ValueMemberPathValueMemberBindingのプロパティが実装されています。このクラスは、AutoCompleteBoxが間接的な値結合を行うために使用するFrameworkElementです。

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 Toolkitの自分を再コンパイルするために喜んでいる場合、これは修正するためにかなり簡単バグがあります。

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

これはリンク先のバグも修正します。

+0

ありがとう、私はこの1つの答えを得るだろうと確信していませんでした。私はWPFにはかなり新しいので、ここで私の要素から少し外れています。 2010年にWPF Toolkitを変換しなければならず、第2の機能を発見したが最初のものではなかった。 – Drew

+0

まだ私のために働いていない、dllとpdbファイルを作成し、私のプロジェクトにそれらを貼り付けましたが、valuememberpathはまだデバッグモードではnullです。 – Drew

+1

再コンパイルされたバージョンを参照した場合は、デバッガで 'acb.ValueMemberPath' =" LastName "'に入ることができます。できない場合は、まだ古いバージョンを使用しています。古いツールキットリファレンスを削除してから、Project - > References - > Browseを使用して、コンパイルしたものを参照してください。 –

関連する問題