2016-03-30 12 views
0

DataGrid üzerinde filtrelemek için ComboBox.SelectedItem kullanmaya çalışıyorum, ancak SelectedItemstring olarak erişmekte olan bir sorun yaşıyorum. Şimdiye kadar denediğim şey bu; Bir istisna ile sonuçlanır;ComboBox'ta Filtre Seçili Öğeyi Dize olarak

Additional information: Unable to cast object of type 'System.String' to type 'System.Windows.Controls.ComboBoxItem'. 

x.Department tip string taşımaktadır. Filtreleme yöntemimde kullanabilmem için SelectedItem'a nasıl düzgün bir şekilde erişebilirim?

DÜZENLEME: ComboBox öğelerinin nasıl eklendiğini göstermek için;

List<string> distinctList = Employees.Select(i => i.Department).Distinct().ToList(); 
distinctList.Insert(0, "Everyone"); 
distinctList.Sort(); 
departmentComboBox.ItemsSource = distinctList; 
+0

Eğer gerçekten bir dizeyse SelectedValue kullanabilirsiniz. Ama eğer aslında sizin sınıfınızsa, eather açık bir dönüşüm kullanın ve gerekli alanı arayın (YourDepartmentClass) departmanıComboBox.SelectedItem.Name örneğin, eather YourDepartmentClass.ToString yöntemini geçersiz kıl ve departmanComboBox.SelectedItem.ToString'i kullanın (String'in üzerine yazmak kötü bir seçenektir)) – Vladimir

+0

Nasıl departmanComboBox.ItemSource ayarlıyorsunuz? ItemSource ComboBoxItems oluşturmak için kullanılır, ComboBoxItems kendileri için kullanamazsınız – Donogst

+0

@Cbreeze teşekkürler, aşağıya bir yanıt ekledim – Donogst

cevap

1

Bu yolu gibi deneyebilirsiniz:

foreach (ComboBoxItem cItem in departmentComboBox.ItemsSource){ 
if (departmentComboBox.SelectedItem != null) 
{ 
    string selectedItemName = this.departmentComboBox.GetItemText(this.departmentComboBox.SelectedItem); 
    criteria.Add(new Predicate<EmployeeModel>(x => x.Department.Equals(selectedItemName))); 
    break;} 
} 
1

Sen SelectedItem ait ToString() yöntemi kullanabilirsiniz.

foreach (ComboBoxItem cItem in departmentComboBox.ItemsSource) 
{ 
    if (departmentComboBox.SelectedItem != null) 
    { 
     criteria.Add(new Predicate<EmployeeModel>(x => x.Department == "" + departmentComboBox.SelectedItem)); 
     break; 
    } 
} 
0

foreach (ComboBoxItem cItem in departmentComboBox.ItemsSource) 
{ 
    if (departmentComboBox.SelectedItem != null) 
    { 
     criteria.Add(new Predicate<EmployeeModel>(x => x.Department == departmentComboBox.SelectedItem.ToString())); 
     break; 
    } 
} 

aksi takdirde aşağıdaki kodu kullanabilirsiniz, combobox öğeleri hiçbir null değer olduğunu, emin olun

Birleşik kutuyu, öğe kaynağı aracılığıyla büyütmek için bir dize listesi oluşturuyorsunuz, bu harika bir şeydir, karışıklık bunlara nasıl erişileceğinin üzerindedir. ItemSource'u tekrar kullanmanız, aynı dize listesini size geri verecektir, daha sonra her birinin seçili ile aynı olup olmadığını kontrol etmeye çalışın. Seçilen öğeyi almanın daha iyi bir yolu, .SelectedItem özelliği. Önce boş olup olmadığına bakın ve çok fazla döngü atlayabilirsiniz :)

 if (departmentComboBox.SelectedItem != null) 
     { 
      criteria.Add(new Predicate<EmployeeModel>(x => x.Department == departmentComboBox.SelectedItem as string)); 
     } 
İlgili konular