2016-11-28 73 views
0

首先:對不好的英語感到抱歉,它不是我的第一語言。如何篩選我的WPF組合框?

我目前正在一個項目中,我有一個我想列在組合框中的人員列表。 我想讓組合框過濾,以便只有列出的人被我搜索。

例如,如果我輸入組合框「Joh」,那麼應該只有以「John」,「Johann」等爲開頭的「Joh」的人。

接下來的事情是,我的組合框不是「可編輯的」,我怎樣才能讓它可以寫入呢?目前它是「鎖定」...

我希望你明白我的問題是什麼,以及如何解決它!

回答

1

所以關於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!

2

這實際上是內置的!

您需要做的是在您的ComboBox控件上設置以下屬性。

<ComboBox ItemsSource="{Binding PersonList}" 
      IsTextSearchEnabled="True" 
      TextSearch.TextPath="Name"/> 

這個例子假設你有Person類型的PersonList,在這種類型PersonName的屬性。

您需要將TextSearch.TextPath設置爲您要搜索的任何屬性(基於您的ItemsSource集合中項目的屬性)。

更多信息,請參閱https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.combobox.istextsearchenabled