帶搜索的combobox就是給combobox一個依賴屬性的itemsource,然后通過數據源中是否包含要查詢的值,重新給combobox綁定數據源。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
public class editcombobox : combobox { private bool t = true ; //首次獲取焦點標志位 private observablecollection< object > bindinglist = new observablecollection< object >(); //數據源綁定list private string edittext = "" ; //編輯文本內容 /// <summary> /// 注冊依賴事件 /// </summary> public static readonly dependencyproperty itemssourcepropertynew = dependencyproperty.register( "myitemssource" , typeof (ienumerable), typeof (editcombobox), new frameworkpropertymetadata( new propertychangedcallback(valuechanged))); /// <summary> /// 數據源改變,添加數據源到綁定數據源 /// </summary> /// <param name="d"></param> /// <param name="e"></param> private static void valuechanged(dependencyobject d, dependencypropertychangedeventargs e) { editcombobox ecb = d as editcombobox; ecb.bindinglist.clear(); //遍歷循環操作 foreach (var item in ecb.myitemssource) { ecb.bindinglist.add(item); } } /// <summary> /// 設置或獲取combobox的數據源 /// </summary> public ienumerable myitemssource { get { return (ienumerable)getvalue(itemssourcepropertynew); } set { if (value == null ) clearvalue(itemssourcepropertynew); else setvalue(itemssourcepropertynew, value); } } /// <summary> /// 重寫初始化 /// </summary> /// <param name="e"></param> protected override void oninitialized(eventargs e) { base .oninitialized(e); this .iseditable = true ; this .istextsearchenabled = false ; this .itemssource = bindinglist; } /// <summary> /// 下拉框獲取焦點,首次搜索文本編輯框 /// </summary> /// <param name="e"></param> protected override void ongotfocus(routedeventargs e) { if (t) findtextbox( this ); else t = false ; } /// <summary> /// 搜索編輯文本框,添加文本改變事件 /// </summary> /// <param name="obj"></param> private void findtextbox(dependencyobject obj) { for ( int i = 0; i < visualtreehelper.getchildrencount(obj); i++) { dependencyobject child = visualtreehelper.getchild(obj, i); if (child!= null && child is textbox) { //注冊文本改變事件 (child as textbox).textchanged += editcombobox_textchanged; } else { findtextbox(child); } } } /// <summary> /// 文本改變,動態控制下拉條數據源 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void editcombobox_textchanged( object sender, textchangedeventargs e) { textbox tb = sender as textbox; if (tb.isfocused) { this .isdropdownopen = true ; if (edittext == this .text) return ; edittext = this .text; setlist(edittext); } } /// <summary> /// 組合框關閉,數據源恢復 /// </summary> /// <param name="e"></param> protected override void ondropdownclosed(eventargs e) { base .ondropdownclosed(e); if (myitemssource == null ) return ; foreach (var item in myitemssource) { if (!bindinglist.contains(item)) bindinglist.add(item); } } /// <summary> /// 過濾符合條件的數據項,添加到數據源項中 /// </summary> /// <param name="txt"></param> private void setlist( string txt) { try { string temp1 = "" ; string temp2 = "" ; if (myitemssource == null ) return ; foreach (var item in myitemssource) { temp1 = item.gettype().getproperty( this .displaymemberpath).getvalue(item, null ).tostring(); if ( string .isnullorempty( this .selectedvaluepath)) { temp2 = "" ; } else { temp2 = item.gettype().getproperty( this .selectedvaluepath).getvalue(item, null ).tostring(); } if (temp1.contains(txt)||temp2.startswith(txt)) { if (!bindinglist.contains(item)) bindinglist.add(item); } else if (bindinglist.contains(item)) { bindinglist.remove(item); } } } catch (exception ex) { messagebox.show(ex.tostring()); } } } |
調用方法就是將數據源綁定到myitemssource上,剩下的就和原有的combobox用法一樣了。
效果演示
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。