AutoCosletebox WPF中的ValueMemberPath绑定仅在姓氏搜索中返回顶部结果?
-
09-10-2019 - |
题
我一直在WPF工具包中使用AutoCompletebox,它几乎满足了我的所有需求,除了这个麻烦 ValueMemberPath
捆绑。这是建议框将自动完成的价值。
因此,我有这个姓氏字段,当用户开始以姓氏为单位时,我根据该名称动态检索了前10个结果。但是,如果用户在“史密斯”中键入并选择列表中的第四名,则始终检索建议列表中的第一个结果,因为 ValueMemberPath
设置为过滤 LastName
. 。它总是认为“史密斯”是第一个结果,即使有50个名字不同的史密斯。
我一直在困扰我的大脑,试图弄清楚如何将名字与此属性合并。我试图改变 ValueMemberPath
成为一个 FullName
等于姓氏和名称的字段。建议框进入逗号后立即停止排序,或者是第一个名称“空间”的最后名称,也不起作用。
我也遇到了问题 ValueMemberPath
因为该值无法动态更改,并且在调试时它是无效的错误: Autococteetebox错误:valuememberpath为null.
我知道是否没有人有完整的解决方案。我只是以为我会问这个问题,以防人们将来遇到这个问题,并且不确定如何处理。
解决方案
这是一个错误 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;
}
}
这也修复了您链接到的错误。