首先:對不好的英語感到抱歉,它不是我的第一語言。如何篩選我的WPF組合框?
我目前正在一個項目中,我有一個我想列在組合框中的人員列表。 我想讓組合框過濾,以便只有列出的人被我搜索。
例如,如果我輸入組合框「Joh」,那麼應該只有以「John」,「Johann」等爲開頭的「Joh」的人。
接下來的事情是,我的組合框不是「可編輯的」,我怎樣才能讓它可以寫入呢?目前它是「鎖定」...
我希望你明白我的問題是什麼,以及如何解決它!
首先:對不好的英語感到抱歉,它不是我的第一語言。如何篩選我的WPF組合框?
我目前正在一個項目中,我有一個我想列在組合框中的人員列表。 我想讓組合框過濾,以便只有列出的人被我搜索。
例如,如果我輸入組合框「Joh」,那麼應該只有以「John」,「Johann」等爲開頭的「Joh」的人。
接下來的事情是,我的組合框不是「可編輯的」,我怎樣才能讓它可以寫入呢?目前它是「鎖定」...
我希望你明白我的問題是什麼,以及如何解決它!
所以關於WPF的一件很酷的事情是它允許綁定。具體而言,將代碼中的屬性綁定到UI中的控件。所以,有一個過濾組合框我會結合你有你的組合框任何對象的列表,像下面的東西:
C#:
private List<Person> myList = new List<Person>();
public List<Person> MyList
{
get { return myList; }
set { myList = value; }
}
WPF:
<ComboBox Name="cboObjects" ItemsSource="{Binding MyList}"/>
,設置了您的組合框被綁定到一個列表。所以現在我們必須將其過濾掉。接下來,我將使用KeyDown事件在每次組合鍵輸入時觸發。然後,在該事件期間,您可以捕獲用戶的文本,並嘗試查找與列表中的內容相匹配的任何內容,然後將列表屬性設置爲等於發現的內容..
private void cboObjects_KeyDown(object sender, KeyEventArgs e)
{
string temp = ((ComboBox)sender).Text;
var newList = MyList.Where(x => x.Name.Contains(temp));
MyList = newList.ToList();
}
現在您的人物列表已被過濾!雖然這樣做有幾個問題,例如您現在不再擁有您的原始列表。另一件事是,如果你採用這種方法,你的用戶界面將不會更新,除非告知它。因此請使用INotifyPropertyChanged接口。它會在你更新一個屬性時觸發一個事件,然後告訴你的用戶界面再次獲取這個值。
最後,至於你的combobox不可編輯,請嘗試設置IsReadOnly = false,並且IsEditable = true!
這實際上是內置的!
您需要做的是在您的ComboBox
控件上設置以下屬性。
<ComboBox ItemsSource="{Binding PersonList}"
IsTextSearchEnabled="True"
TextSearch.TextPath="Name"/>
這個例子假設你有Person
類型的PersonList
,在這種類型Person
有Name
的屬性。
您需要將TextSearch.TextPath
設置爲您要搜索的任何屬性(基於您的ItemsSource
集合中項目的屬性)。