2017-06-10 5 views
0

Wie kann ich Daten zur Laufzeit an Combobox binden? Ich verwende das Template-Feld in der Combobox und ich versuche, die Combobox-Item-Quelle in Code-Behind zu aktualisieren. aber nicht aktualisieren Xamarin meine Combobox in Form. und im Combobox-Vorlagenfeld möchte ich das Combobox-Element mit einer Schaltfläche löschen, die den Ereignisnamen cbxDeleteStudent_Click enthält. aber ich kann comboxitem im Code nicht finden.Wie kann ich Combobox in WPF zur Laufzeit hinzufügen

Bitte helfen Sie mir.

MyCodes:

<ComboBox x:Name="cbxStudents" Width="150" ItemsSource="{Binding}"> 
       <ComboBox.ItemTemplate> 
        <DataTemplate> 
         <DockPanel Width="150"> 
          <Label Content="{Binding StudentId}" x:Name="cbxStudentId"></Label> 
          <Label Content="{Binding StudentName}"></Label> 
          <Button Content="Sil" x:Name="cbxDeleteStudent" HorizontalAlignment="Right" Width="35" 
            CommandParameter="{Binding StudentId}" Click="cbxDeleteStudent_Click"></Button> 
         </DockPanel> 
        </DataTemplate> 
       </ComboBox.ItemTemplate> 
      </ComboBox> 

Code hinter

private void btnAddNewStudent_Click(object sender, RoutedEventArgs e) 
    { 
     using (EmployeeDbContext db = new EmployeeDbContext()) 
     { 
      Student newStudent = new Student() 
      { 
       StudentName = txtStudent.Text 
      }; 
      db.Students.Add(newStudent); 

      if (db.SaveChanges() > 0) 
      { 
       MessageBox.Show(string.Format("{0} öğrencisi başarı ile eklenmiştir.", txtStudent.Text), "Bilgi", MessageBoxButton.OK); 
       txtStudent.Text = string.Empty; 
       (cbxStudents.ItemsSource as List<Student>).Add(newStudent); 

      } 
     } 
    } 

zum Löschen Combobox Artikel

private void cbxDeleteStudent_Click(object sender, RoutedEventArgs e) 
    { 
     using (EmployeeDbContext db = new EmployeeDbContext()) 
     { 
      Student selectedStudent = db.Students.Find(int.Parse((sender as Button).CommandParameter.ToString())); 
      db.Students.Remove(selectedStudent); 
      db.SaveChanges(); 
     } 
     ((sender as Button).Parent as DockPanel).Children.Clear(); 

    } 
+1

Willkommen bei SO. Bitte lesen Sie dieses [how-to-ask] (http://stackoverflow.com/help/how-to-ask) und folgen Sie den dortigen Richtlinien, um Ihre Frage mit zusätzlichen Informationen wie Code und Fehlermeldung zu verfeinern, um Ihre Programmierung zu beschreiben Problem. – thewaywewere

+0

Geben Sie die Definition für die Klasse "EmployeeDbContext" und den Code zum Binden des 'DataContext' an. – kennyzx

Antwort

0

Es sieht aus wie die der ItemSource an die ComboBox zu binden, verwendet wird, ist ein List<Student>.

Verwenden ObservableCollection(Of T) statt List<T>, ObservableCollection bietet Benachrichtigung, wenn Elemente hinzugefügt bekommen, entfernt oder wenn die gesamte Liste aktualisiert und die ComboBox Elemente werden aktualisiert, während List<T> nicht der Fall ist.

Dann müssen Sie nur das Objekt aus der ObservableCollection hinzufügen/entfernen, ohne die Items-Eigenschaft der ComboxBox zu berühren.

hinzufügen

(cbxStudents.ItemsSource as ObservableCollection<Student>).Add(newStudent); 

entfernen Um

ObservableCollection<Student> students = cbxStudents.ItemsSource as ObservableCollection<Student>; 
int studentId = int.Parse((sender as Button).CommandParameter.ToString()); 
Student selectedStudent = students.SingleOrDefault(s => s.StudentId == studentId); 
students.Remove(selectedStudent); 
+0

Danke für die perfekte Antwort. –

Verwandte Themen