Привязка валютрамберпы в AutoCompleteBox WPF возвращает только TOP результат в поисках последнего имени?
-
09-10-2019 - |
Вопрос
Я использовал AutoCompletebebebebe в Toolkit WPF, и это только о встречах всех моих потребностей, все кроме этого хлопот ValueMemberPath
Привязка. Это значение того, что поле «Предлагаемое» автоматически завершится.
Таким образом, у меня есть эта последнее поле имя, и когда пользователь начинает печатать в фамилию, я динамически извлекаю 10 лучших результатов на основе этого. Однако, если пользователи в «Smith» и выбирают, скажем, 4-е название в списке, он всегда извлекает первый результат в списке предложений, потому что ValueMemberPath
установлен на фильтр по LastName
. Отказ Это всегда просто думает, что «Смит» - это первый результат, даже если есть 50 Smiths с разными именами.
Я разрушил свой мозг, пытаясь выяснить, как включить имя с помощью этого свойства. Я пытался изменить ValueMemberPath
быть FullName
поле, которое равнило фамилию, а именно имя. Предлагаемое поле останавливает сортировку, как только запятая введена, или если это имя имени «пространство», которое тоже не работает.
Я также столкнулся с проблемами с ValueMemberPath
Поскольку это значение не может быть изменено динамически, и есть ошибка, в которой он нулевой при отладке: AutoCompleteBox Bug: ValueMampath Dull.
Я понимаю, если никто не имеет полного решения. Я просто подумал, что задал вопрос, если люди станут в это в будущем, и не уверен, как справиться с этим.
Решение
Это ошибка в AutoCompleteBox
. Отказ Внутреннее для контроля ValueMemberPath
и ValueMemberBinding
Свойства реализованы с использованием называемого типа BindingEvaluator
. Отказ Этот класс является FrameworkElement
что то AutoCompleteBox
использует для выполнения непрямого значения.
Проблема в том, что когда 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;
}
}
Это также исправляет ошибку, с которой вы связаны.