Привязка ValueMemberPath в AutoCompleteBox WPF возвращает только верхний результат при поиске по фамилии?

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

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

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

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

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


person Drew    schedule 10.01.2011    source источник


Ответы (1)


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

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

person Rick Sladkey    schedule 11.01.2011
comment
Большое спасибо, я не был уверен, что получу ответ на этот вопрос. Я новичок в WPF, поэтому я немного не в своей тарелке. пришлось преобразовать WPF Toolkit в 2010, и я копаюсь, нашел вторую функцию, но не первую. - person Drew; 11.01.2011
comment
все еще не работает для меня, создал файлы dll и pdb и вставил их в свой проект, однако путь valuememberpath по-прежнему имеет значение null в режиме отладки. - person Drew; 11.01.2011
comment
Если вы ссылались на перекомпилированную версию, вы сможете перейти к acb.ValueMemberPath = LastName` в отладчике. Если вы не можете, вы по-прежнему используете старую версию. Удалите старый справочник по набору инструментов, а затем используйте Project - ›References -› Найдите ссылку на тот, который вы скомпилировали. - person Rick Sladkey; 11.01.2011