2016-03-30 7 views
0

Ich versuche eine ComboBox.SelectedItem zu verwenden, um auf einem DataGrid zu filtern, jedoch habe ich ein Problem beim Zugriff auf SelectedItem als string. Das habe ich bisher versucht;Filter auf ComboBox Ausgewähltes Objekt als String

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

Dies führt zu einer Ausnahme;

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

x.Department ist vom Typ string. Wie kann ich auf die SelectedItem richtig zugreifen, damit ich sie richtig in meiner Filtermethode verwenden kann?

EDIT: Um zu zeigen, wie die ComboBox Elemente hinzugefügt werden;

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

Sie können SelectedValue verwenden, wenn es wirklich Zeichenfolge ist. Aber wenn es tatsächlich Ihre Klasse ist, dann verwenden Sie entweder explizite Konvertierung und rufen Sie das benötigte Feld ab (YourDepartmentClass) departmentComboBox.SelectedItem.Name zum Beispiel eather überschreiben Sie YourDepartmentClass.ToString-Methode und verwenden Sie departmentComboBox.SelectedItem.ToString (Überschreiben in String ist eine schlechte Option) – Vladimir

+0

Wie stellen Sie departmentComboBox.ItemSource ein? ItemSource wird verwendet, um die ComboBoxItems zu generieren, Sie können es nicht verwenden, um auf die ComboBoxItems selbst zuzugreifen – Donogst

+0

@Cbreeze danke, ich habe eine Antwort unten hinzugefügt – Donogst

Antwort

1

Sie mögen diese Art und Weise versuchen:

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

können Sie die ToString() Methode des SelectedItem verwenden.

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

Stellen Sie sicher, dass es in den Punkten der Combobox, sonst können Sie den folgenden Code, kein null Wert ist:

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

Sie erstellen eine Liste von Zeichenfolgen, um das Kombinationsfeld über die Elementquelle aufzufüllen, was großartig ist, die Verwirrung darüber, wie Sie darauf zugreifen. Wenn Sie ItemSource erneut verwenden, erhalten Sie die gleiche String-Liste zurück, die Sie dann überprüfen möchten, um zu sehen, ob sie mit der ausgewählten übereinstimmen. Eine bessere Methode zum Abrufen des ausgewählten Elements ist die Eigenschaft .SelectedItem. Überprüfen Sie zunächst auf Null und Sie können die for-Schleife auch ablegen :)

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