DevExpress LookUpEdit控件如何设置搜索结果先显示StartWith匹配项,再显示Contains匹配项
DevExpress LookUpEdit控件如何设置搜索结果先显示StartWith匹配项,再显示Contains匹配项
嗨,这个需求确实没法直接通过默认的FilterCondition实现,不过咱们可以用DevExpress提供的自定义过滤和排序能力来轻松搞定!
首先,你需要修改XAML里的配置:把FilterCondition改成Custom(因为要自己写过滤逻辑),然后给LookUpEdit添加CustomFiltering事件,调整后的代码如下:
<LookUpEdit ItemsSource="{Binding …}" IsReadOnly="{Binding …}" ShowSizeGrip="False" AutoPopulateColumns="False" FilterCondition="Custom" FindMode="Always" SelectedItem="{Binding …}" CustomFiltering="LookUpEdit_CustomFiltering">
接下来在后台代码里实现这个事件的处理逻辑:我们要先筛选出所有匹配(开头匹配或包含匹配)的项,然后通过FilteringPriority属性控制排序优先级——数值越小的项排序越靠前,这样就能让以搜索文本开头的项排在最前面。
private void LookUpEdit_CustomFiltering(object sender, DevExpress.Xpf.Editors.CustomFilteringEventArgs e) { var lookUpEdit = sender as LookUpEdit; if (lookUpEdit == null || string.IsNullOrWhiteSpace(e.SearchText)) { e.Accepted = true; return; } // 获取当前项的显示文本,控件会自动根据你设置的DisplayMember处理 string itemDisplayText = lookUpEdit.GetDisplayText(e.Item); bool startsWithMatch = itemDisplayText.StartsWith(e.SearchText, StringComparison.CurrentCultureIgnoreCase); bool containsMatch = itemDisplayText.Contains(e.SearchText, StringComparison.CurrentCultureIgnoreCase); // 保留所有符合条件的项:要么以搜索文本开头,要么包含搜索文本 e.Accepted = startsWithMatch || containsMatch; // 设置优先级:开头匹配的项优先级更高,排在列表最前面 e.FilteringPriority = startsWithMatch ? 0 : 1; }
这样设置完成后,当你输入搜索内容时,所有以该内容开头的项会优先显示在列表顶部,后面紧跟着所有包含该内容的其他项,完全满足你的需求!
如果你的项目采用MVVM模式,不想在后台代码中直接写事件处理,也可以通过附加属性或者自定义Behavior来封装这个逻辑,不过上面的方式是最直接高效的方案。
备注:内容来源于stack exchange,提问作者Igor Tarasov
相关产品推荐
相关产品推荐

