Привязка валютрамберпы в AutoCompleteBox WPF возвращает только TOP результат в поисках последнего имени?

StackOverflow https://stackoverflow.com/questions/4648527

  •  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;
    }
}

Это также исправляет ошибку, с которой вы связаны.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top