AutoCompleteBox WPFでのValueMemberPathバインディングは、姓検索でトップの結果のみを返しますか?
-
09-10-2019 - |
質問
私はWPFツールキットでAutoCompleteBoxを使用していますが、この面倒を除くすべてのニーズを満たしています。 ValueMemberPath
バインディング。これは、提案ボックスが自動化する値です。
したがって、この姓フィールドがあり、ユーザーが姓のタイピングを開始すると、それに基づいて上位10の結果を動的に取得します。ただし、ユーザーが「スミス」を入力してリストの4番目の名前を選択する場合、常に最初の結果を提案リストで取得します。 ValueMemberPath
フィルターするように設定されています LastName
. 。 「スミス」は、異なる名の50人のスミスがいる場合でも、「スミス」が最初の結果であると常に考えています。
私は、このプロパティに名を組み込む方法を見つけようとして脳を壊してきました。私は変えようとしました ValueMemberPath
になる FullName
LastNameとFirstNameに等しいフィールド。提案ボックスは、コンマが入力されるとすぐにソートを停止します。
私も問題に遭遇しました ValueMemberPath
この値を動的に変更することはできず、デバッグ中にnullであるバグがあります。 AutoCompleteBoxバグ:ValueMemberPathはnullです.
誰も完全な解決策を持っていないかどうかを理解しています。将来、人々がこれに出くわした場合に備えて質問をすると思っただけで、これをどのように処理するかわからない。
解決
これはのバグです AutoCompleteBox
. 。コントロールの内部 ValueMemberPath
と ValueMemberBinding
プロパティは、呼ばれるタイプを使用して実装されます BindingEvaluator
. 。このクラスはaです FrameworkElement
それ AutoCompleteBox
間接的な値バインディングを行うために使用します。
問題は、a 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;
}
}
これにより、リンクしたバグも修正されます。