2

我一直在 WPF 工具包中使用 AutoCompleteBox,它几乎可以满足我的所有需求,除了这个麻烦的ValueMemberPath绑定。这是建议框将自动完成的值。

所以我有这个姓氏字段,当用户开始输入姓氏时,我会根据它动态检索前 10 个结果。但是,如果用户键入“Smith”并选择说列表中的第四个名字,它总是会检索建议列表中的第一个结果,因为ValueMemberPath设置为 filter by LastName。它总是认为“史密斯”是第一个结果,即使有 50 个名字不同的史密斯。

我一直在绞尽脑汁想弄清楚如何将名字与这个属性结合起来。我试图更改ValueMemberPathFullName等于姓氏和名字的字段。一旦输入逗号,建议框就会停止排序,或者如果它是 firstname 'space' lastname 也不起作用。

我也遇到了问题,ValueMemberPath因为该值无法动态更改,并且在调试时存在错误:AutoCompleteBox Bug : ValueMemberPath is Null

我理解如果没有人有完整的解决方案。我只是想我会问这个问题,以防人们将来遇到这个问题并且不确定如何处理这个问题。

4

1 回答 1

5

这是AutoCompleteBox. 控件内部的ValueMemberPathValueMemberBinding属性是使用称为 的类型实现的BindingEvaluator。这个类是FrameworkElement用来AutoCompleteBox做间接值绑定的。

问题是当 aBindingEvaluator与逻辑树断开连接时,绑定不起作用。以下是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;
    }
}

这也修复了您链接到的错误。

于 2011-01-11T04:12:14.020 回答