让Silverlight AutoCompleteBox控件支持多属性筛选
首先我们先建立一个实体类并创建它的集合用于绑定控件的ItemSource属性,这个实体类有两个属性,如下:
1: public class AUser
2: {
3: public string Name { set; get; }
4: public string Age { set; get; }
5: }
<sdk:AutoCompleteBox Height="28" Name="autoCompleteBox1" ValueMemberPath="Age" >
<sdk:AutoCompleteBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Age}"/>
</StackPanel>
</DataTemplate>
</sdk:AutoCompleteBox.ItemTemplate>
</sdk:AutoCompleteBox>
大家都知道, 一般情况下AutoCompleteBox控件只能筛选绑定项中的一个属性,(及ValueMemberPath在本例中只能设置为Name或Age),并且ValueMemberPath属性中的路径既是筛选属性路径又是选定项的结果属性路径。
接下来我们扩展它,使它能支持多属性路径,并能指定输出结果属性路径。我的解决思路是利用附加属性的力量达到目标,代码如下:
1: public static class AutoCompleteBoxHelper
2: {
3: private static void OnIsOtherPathChanged(DependencyObject obj,
DependencyPropertyChangedEventArgs e)
4: {
5: var acb = obj as AutoCompleteBox;
6: if (!string.IsNullOrEmpty(e.NewValue.ToString()))
7: {
8: acb.ItemFilter = (s,item)=>{
9: var objType = item.GetType();
10: string path = GetOtherPaths(acb);
11: var pathes = path.Split(',');
12: bool result = false;
13: foreach (string p in pathes)
14: {
15: var propertyInfo = objType.GetProperty(p);
16: string value = propertyInfo.GetValue(item, null).ToString();
17: result |= value.Contains(s);
18: }
19: return result;
20: };
21: }
22: else
23: acb.ItemFilter = null;
24: }
25:
26: public static string GetOtherPaths(DependencyObject obj)
27: {
28: return (string)obj.GetValue(OtherPathsProperty);
29: }
30:
31: public static void SetOtherPaths(DependencyObject obj, string value)
32: {
33: obj.SetValue(OtherPathsProperty, value);
34: }
35:
36: public static readonly DependencyProperty OtherPathsProperty =
37: DependencyProperty.RegisterAttached("OtherPaths", typeof(string),
38: typeof(AutoCompleteBoxHelper),
39: new PropertyMetadata("", OnIsOtherPathChanged));
40: }
OtherPaths属性就是一个支持多属性路径的属性(如”Name,Age”),并且指定了OtherPaths后ValueMemeberPath的筛选作用就不再工作了,而只保留了选定结果项属性路径的功能。
最后要叫它工作:
<sdk:AutoCompleteBox Height="28" Name="autoCompleteBox1" ValueMemberPath="Age"
loc:AutoCompleteBoxHelper.OtherPaths="Age,Name">
运行结果:
作者: YOYOFx
出处:https://www.cnblogs.com/maxzhang1985/p/12673160.html
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架