2013-08-10 41 views
9

Tôi có điều này:Kiểm tra nếu một ComboBox chứa mục

<ComboBox SelectedValuePath="Content" x:Name="cb"> 
    <ComboBoxItem>Combo</ComboBoxItem> 
    <ComboBoxItem>Box</ComboBoxItem> 
    <ComboBoxItem>Item</ComboBoxItem> 
</ComboBox> 

Nếu tôi sử dụng

cb.Items.Contains("Combo") 

hoặc

cb.Items.Contains(new ComboBoxItem {Content = "Combo"}) 

nó trả False.

Bất kỳ ai cũng có thể cho tôi biết cách kiểm tra xem ComboBoxItem có tên Combo tồn tại trong ComboBoxcb không?

+2

ComboBox không có tên để bạn tham chiếu đến nó như thế nào? – Paparazzi

+0

Tốt nhất là đăng mã để tái tạo sự cố. – Paparazzi

+3

Nếu bạn đang tìm kiếm tốc độ, hãy liên kết mã nguồn với một HashSet của chuỗi và kiểm tra xem HashSet có chứa chuỗi không. Nếu bạn cần chèn động và xóa thì ObservableCollection. Sử dụng ComboBox làm bộ sưu tập không tối ưu. – Paparazzi

Trả lời

12

Các mục là ItemCollectionnot list of strings. Trong trường hợp của bạn là collection of ComboboxItem và bạn cần kiểm tra thuộc tính Content của nó.

cb.Items.Cast<ComboBoxItem>().Any(cbi => cbi.Content.Equals("Combo")); 

HOẶC

cb.Items.OfType<ComboBoxItem>().Any(cbi => cbi.Content.Equals("Combo")); 

Bạn có thể lặp qua từng hạng mục và phá vỡ trong trường hợp bạn tìm thấy mong muốn mục -

bool itemExists = false; 
foreach (ComboBoxItem cbi in cb.Items) 
{ 
    itemExists = cbi.Content.Equals("Combo"); 
    if (itemExists) break; 
} 
+0

Và điều gì khiến bạn nghĩ rằng điều này sẽ ảnh hưởng đến hiệu suất? –

+0

Tôi phải làm điều này nhiều lần mỗi giây. Làm chậm GUI. – Elmo

+0

Tôi không hiểu. 'Chứa' cũng nội bộ vòng trên toàn bộ danh sách cho đến khi nó tìm thấy một yếu tố mong muốn. –

3

Nếu bạn muốn sử dụng Contains chức năng như trong cb.Items.Contains("Combo") bạn có để thêm chuỗi vào ComboBox của bạn, không phải ComboBoxItems: cb.Items.Add("Combo"). Chuỗi sẽ hiển thị giống như một ComboBoxItem.

Các vấn đề liên quan