2016-08-14 2 views
0

Bitte helfen!Refresh Combobox beim Navigieren auf Datagrid

Ich habe viele Recherchen im Internet gemacht, aber keine Lösung für meine Frage gefunden.

Ich habe eine Form mit Lebensmitteln. Es gibt ein Raster auf dem Formular und damit kann ich auf dem Essenstisch navigieren. Auf dem Bildschirm (nicht im Raster) befindet sich eine Combobox, die die Kategorien enthält. Die Combobox ist mit den Kategorien aus der Kategorietabelle gefüllt. Wenn ich den Datensatz im Datagrid ändere, werden alle Felder im Formular außer der Combobox aktualisiert.

Also meine Frage ist: Was muss ich tun, um die Combobox zu aktualisieren, um die gespeicherte Kategorie zu zeigen, wenn ich auf dem Gitter navigieren? In der Kategorietabelle hat die Kategorie das Feld "id" und in der Nahrungstabelle gibt es ein Feld "categoryid".

Ich habe dies in der XAML-Datei:

<ComboBox x:Name="categoryComboBox" Grid.Row="5" Grid.Column="1" Margin="3,4,20,0" Grid.ColumnSpan="3" 
        ItemsSource="{Binding Source={StaticResource categoryViewSource}}" 
        SelectedValuePath="CategoryId" 
        DisplayMemberPath="CatName" 
        SelectedItem="{Binding CategoryId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
        Height="25" VerticalAlignment="Top"> 
      <ComboBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <VirtualizingStackPanel/> 
       </ItemsPanelTemplate> 
      </ComboBox.ItemsPanel> 
     </ComboBox> 
+0

Hallo, Sie sollten Ihre ComboBox SourceItems-Auflistung jedes Mal aktualisieren, wenn Sie die neue DataGrid-Zeile auswählen. Diese Sammlung sollte an eine ObservableCollection innerhalb des ComboBox-DataContext gebunden sein.Sie sollten diese Sammlung also löschen und neu füllen. – Ilan

+0

Vielen Dank für Ihre Antwort. – Zoltan

+0

Die Combo-Elementquelle ist ItemsSource = "{Binding Source = {StaticResource categoryViewSource}}". Die Elemente ändern sich während der Navigation nicht (hinzufügen/entfernen) in der Combobox. Gerade sollte den relevanten Wert anzeigen. Zum Beispiel: die Combobox-Elemente im Moment "Erste Kategorie", "Zweite Kategorie". Wenn sich der Cursor auf dem ersten Datensatz im Datagrid befindet, sollte das Kombinationsfeld "Erste Kategorie" beschlagen, wenn der Cursor auf dem zweiten Datensatz steht, sollte das Kombinationsfeld "Zweite Kategorie" anzeigen. – Zoltan

Antwort

0

Wie ich sehe, dass Sie einen kleinen Fehler in Ihrem Code haben. Ich sollte den SelectedValue anstelle von SelectedItem verwenden. Also ändere es und ich denke, es wird richtig funktionieren. Und zusätzlich brauchst du keine Workaround mit der Skalierung wie ich es vorher vorgeschlagen habe. Hier ist Beispiel:

XAML

 <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" > 
     <ComboBox x:Name="categoryComboBox" ItemsSource="{Binding Source={StaticResource categoryViewSource}}" 
       SelectedValuePath="CategoryId" 
       DisplayMemberPath="CatName" 
       SelectedValue="{Binding CategoryId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
       Height="25" VerticalAlignment="Top"> 
      <ComboBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <VirtualizingStackPanel/> 
       </ItemsPanelTemplate> 
      </ComboBox.ItemsPanel> 
     </ComboBox> 
     <Button Content="Change Category" Command="{Binding SelectionChangedCommand}"></Button> 
    </StackPanel> 

Datacontext

public class MyComboDataContext:BaseObservableObject 
{ 
    private int _categoryId; 
    private ICommand _selectionChangedCommand; 

    public MyComboDataContext() 
    { 
     CategoryId = 1; 
    } 

    public int CategoryId 
    { 
     get { return _categoryId; } 
     set 
     { 
      _categoryId = value; 
      OnPropertyChanged(); 
     } 
    } 


    public ICommand SelectionChangedCommand 
    { 
     get { return _selectionChangedCommand ?? (_selectionChangedCommand = new RelayCommand(SelectionChanger)); } 
    } 

    private void SelectionChanger() 
    { 
     CategoryId += 1; 
     if (CategoryId == 4) 
      CategoryId = 1; 
    } 
} 

Erläuterungen:

Zunächst einmal ist dies ein Beispiel das ist simulieren das Update einer Combo. Hier wird der ausgewählte Combobox-Wert bei jedem Tastenklick geändert. In Ihrem Beispiel sollte die Kategorieauswahl den Combo-ausgewählten Wert beeinflussen. Jedes Mal, wenn die Grid-Kategorie ausgewählt wird, sollten Sie die ausgewählte Kategorie-ID in die Eigenschaft verschieben, an die die Combo SelectedValue gebunden ist.

Um Sie bitte aktualisieren Sie Ihre Frage mit folgenden Dingen zu helfen:

  1. Gibt es irgendwelche Bindungsausdruck Fehler in Ihrem Ausgabefenster?
  2. Wie behandeln Sie eine DataGrid-Auswahl in Ihrem Code.
  3. Wie wirkt sich die Auswahl des Datenrasters auf die Combobox SelectedValue aus (muss ausgewählt werden)?

Lassen Sie mich wissen, wenn Sie weitere Hilfe benötigen. Und fühlen Sie sich frei, Ihre Frage als beantwortet zu markieren, wenn meine Antwort hilfreich war.

+0

Danke Ilan für deine sehr gute Hilfe. Ich werde es am Abend versuchen. Nur ein wenig verwirrt, auf dem Datagrid gibt es keine Kategorie-Combobox zur Auswahl der Kategorie. Das Gitter zeigt die Nahrungsmitteltabelle und enthält nur, zu welcher Kategorie gehört. Auf dem Gitter bewegt sich der Cursor auf dem Essenstisch und ich möchte nur den richtigen Namen der Kategorie in der Kategorie Combobox anzeigen. Bitte sehen Sie sich die Bilder an. Der erste Datensatz im Datagrid hat (versehentlich) keine Kategorie-ID. – Zoltan

+0

Hallo Ilan, leider hat dein Code nicht geholfen. Wir sind nicht im selben Boot. Wahrscheinlich meine Erklärung nicht zu gut. Ich denke, mein Problem ist einfacher. Ich habe versucht in C# -Form es funktioniert gut. Aber WPF kann ich nicht machen. Ich versuche es noch einmal zu erklären: Es gibt eine Form, die den Essenstisch pflegt. Auf dem Essenstisch kann ich mich mit dem Datagrid bewegen. Wenn ich einen anderen Datensatz jedes Feld auf der Formularaktualisierung mit Ausnahme der Combobox auswähle. Die Combobox zeigt nur die erste Kategorie an. Meine Erwartung ist, wenn ich einen anderen Datensatz auf dem Gitter auswähle, zeigt die Combo die relevante Kategorie an. Bitte beachten Sie die Bilder. Vielen Dank – Zoltan

+0

@ Zoltan Lieber Zoltan, Sie haben mindestens einen Fehler in Ihrem Code. Sie müssen an die SelectedValue-Eigenschaft gebunden sein (da Sie die Daten über die SelectedValuePath-Kombinationseigenschaft erhalten). Alle anderen Dinge sind die verbindlichen Probleme, Sie sollten die Bindung korrekt verwalten. Ich werde Fragen hinzufügen, versuche sie zu beantworten. – Ilan

Verwandte Themen