AutoCosletebox WPF中的ValueMemberPath绑定仅在姓氏搜索中返回顶部结果?

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

  •  09-10-2019
  •  | 
  •  

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

因此,我有这个姓氏字段,当用户开始以姓氏为单位时,我根据该名称动态检索了前10个结果。但是,如果用户在“史密斯”中键入并选择列表中的第四名,则始终检索建议列表中的第一个结果,因为 ValueMemberPath 设置为过滤 LastName. 。它总是认为“史密斯”是第一个结果,即使有50个名字不同的史密斯。

我一直在困扰我的大脑,试图弄清楚如何将名字与此属性合并。我试图改变 ValueMemberPath 成为一个 FullName 等于姓氏和名称的字段。建议框进入逗号后立即停止排序,或者是第一个名称“空间”的最后名称,也不起作用。

我也遇到了问题 ValueMemberPath 因为该值无法动态更改,并且在调试时它是无效的错误: Autococteetebox错误:valuememberpath为null.

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

有帮助吗?

解决方案

这是一个错误 AutoCompleteBox. 。控制内部 ValueMemberPathValueMemberBinding 使用称为的类型实现属性 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