Привязка ValueMemberPath в AutoCompleteBox WPF возвращает только лучший результат при поиске фамилии? - PullRequest
2 голосов
/ 10 января 2011

Я использую AutoCompleteBox в WPF Toolkit, и он почти соответствует всем моим потребностям, за исключением этой проблемной привязки ValueMemberPath.Это значение, которое поле подсказки будет автоматически заполнять.

Итак, у меня есть это поле фамилии, и когда пользователь начинает вводить фамилию, я динамически извлекаю первые 10 результатов на основе этого.Однако, если пользователь вводит слово «Смит» и выбирает, скажем, 4-е имя в списке, он всегда получает первый результат в списке предложений, поскольку для ValueMemberPath задано значение фильтра LastName.Он всегда думает, что «Смит» - это первый результат, даже если есть 50 кузнецов с разными именами.

Я ломал голову, пытаясь понять, как включить имя в это свойство.Я попытался изменить ValueMemberPath на FullName поле, равное фамилии и имени.Поле ввода предложений прекращает сортировку, как только вводится запятая или если это имя «пробел», фамилия тоже не работает.

У меня также возникли проблемы с ValueMemberPath, поскольку это значение неизменяться динамически, и при отладке возникает ошибка, в которой он равен нулю: AutoCompleteBox Ошибка: ValueMemberPath равно Null .

Я понимаю, что ни у кого нет полного решения.Я просто подумал, что задам вопрос на случай, если люди столкнутся с этим в будущем и не уверены, как с этим справиться.

1 Ответ

5 голосов
/ 11 января 2011

Это ошибка в 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 Toolkit.

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

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

...