2016-05-28 6 views
0

Ich habe ein Datagrid mit einer beobachtbaren Sammlung.C# wpf datagrid mit observablecollection. Nachdem ein Benutzer sortiert hat, kann ich den selektierten Index der observablecollection nicht erhalten

<DataGrid Name="DataGridMemoryTable" AlternatingRowBackground="Beige" Canvas.Left="87" Canvas.Top="30" Width="500" Height="300" RowHeight="20" ColumnWidth="60" 
         SelectionMode="Single" CanUserSortColumns = "False" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="10" ItemsSource="{Binding}" 
         CurrentCellChanged="DataGridMemoryTableCellChanged" Sorting="DataGridMemoryTable_Sorted"/> 

Und

public ObservableCollection<SavedMemorySWL> SavedMemorySWLObservableCollection = new ObservableCollection<SavedMemorySWL>(); 
    public class SavedMemorySWL : INotifyPropertyChanged 
    { 
     public String Frequency { get; set; } 
     public String Time { get; set; } 
     public String Days { get; set; } 
     public String ITU_Station { get; set; } 
     public String Language_Target_Remarks { get; set; } 
     public String Program_Start_Stop { get; set; } 
     public String ATAUTOinductor { get; set; } 
     public String ATAUTOcapacitor { get; set; } 
     public String Antenna { get; set; } 
     public Boolean Scan { get; set; } 
     public String AT200PCinductor { get; set; } 
     public String AT200PCcapacitor { get; set; } 

     public event PropertyChangedEventHandler PropertyChanged; 
    } 

und nach Zeilen in die ObservableCollection Hinzufügen ...

Global.MW.DataGridMemoryTable.Dispatcher.Invoke(new Action(() => 
      { 
       if (Global.MW != null) 
       { 
        Global.MW.DataGridMemoryTable.ItemsSource = SavedMemorySWLObservableCollection; 
        Global.MW.DataGridMemoryTable.Items.Refresh(); 
        Global.MW.textBoxFileName.Text = memoryRows.FileName; 
       } 
      })); 

So ist das Problem, dass wenn ich erlaube durch den Benutzer Spaltensortierung, ich dann später Abrufen der ausgewählten Zeile und stimmt nicht mit der Zeile in der ObservableCollection überein.

//int row = DataGridMemoryTable.SelectedIndex; 
     int row = DataGridMemoryTable.Items.IndexOf(DataGridMemoryTable.SelectedItem); //.SelectedIndex; 

So, nach dem Sortieren der Benutzer klickt auf eine Schaltfläche, um etwas mit seiner ausgewählten Zeile zu tun. Wenn es die oberste Zeile ist, ist der ausgewählte Index 0. Aber die Werte in der ObservableCollection sind nicht sortiert, und ich mache diese Operation für die falsche ObservableCollection-Zeile.

Mein aktueller Ansatz ist es, die Sortierung durch den Benutzer nicht zuzulassen.

Hat jemand eine Idee, wie man den ausgewähltenIndex in einen Index in die ObservableCollection konvertiert?

+0

Wenn der Benutzer eine Spalte sortieren, die ObservableCollection anstelle der Daten im Datagrid sortiert. – jdweng

+0

Ich bin verwirrt, warum Sie Ihr Datengrid manuell aktualisieren. ObservableCollections informiert automatisch Objekte, die an sie gebunden sind, wenn sie sich ändern. Der Binding-Ausdruck Ihres DataGrids ist einfach {Binding}, was bedeutet, dass er den übergeordneten DataContext verwendet - ist der übergeordnete DataContext Ihre ObservableCollection? Es sollte - wenn Sie es so machen, sollte die Aktualisierung für sich selbst sorgen, und dieses Problem sollte weggehen. – Travis

+0

jdweng. Das ist eine gute Idee. Es ist zusätzliche Arbeit/Codierung, aber es ist eine machbare Lösung. Das Ereignis "Sorted" übergibt DatGridSortingEventArgs e. e.Column.SortMemberPath und e.Column.SortDirection geben Informationen über die vom Benutzer initiierte Sortierung. Travis. Ja, wenn der Benutzer Änderungen am Datagrid vornimmt, wird die ObservableCollection automatisch geändert. Es scheint jedoch, dass eine vom Benutzer initiierte Spaltensortierung für das Datagrid nicht in der ObservableCollection reflektiert wird. – Howard

Antwort

0

Ich habe vor dieser Frage gesucht, aber nach noch mehr Suche fand ich die Antwort.

Sort ObservableCollection bound to DataGrid in MVVM

Die Antwort ist, dass es nicht möglich ist.

Benutzer Durch das Sortieren des Datagrids werden die Unterstreichungsdaten in ObservableCollection niemals geändert. Es gibt keinen Weg, dies zu erreichen. Anscheinend hat Microsoft nicht vorausgesehen, dass irgendjemand möchte, dass die Unterstreichungsdaten ebenfalls sortiert werden, also gibt es keine Eigenschafteneinstellung oder Methode, um dies zu erreichen.

Die Benutzersortierung wirkt sich nur auf die Daten in einer ICollectionView aus. Es gibt jedoch eine Möglichkeit, ICollectionView zu betrachten und zu kopieren, wie in der Beitragsnummer 2 in diesem Thread gezeigt.

public ICollectionView myCVSWL { get; set; } 
internal SavedMemorySWL[] MemoriesSWL = new SavedMemorySWL[MAX_ROWS_SWL]; 
. 
. 
. 
Global.MW.DataGridMemoryTable.Dispatcher.Invoke(new Action(() => 
      { 
       if (Global.MW != null) 
       { 
        myCVSWL = CollectionViewSource.GetDefaultView(SavedMemorySWLObservableCollection); 
        Global.MW.DataGridMemoryTable.ItemsSource = myCVSWL; // SavedMemorySWLObservableCollection; 
        Global.MW.DataGridMemoryTable.Items.Refresh(); 
        Global.MW.textBoxFileName.Text = memoryRows.FileName; 
       } 
      })); 
. 
. 
. 





         int k = 0; 
        foreach (var item in myCVSWL.OfType<SavedMemorySWL>()) 
        { 
         memoryRows.MemoriesSWL[k].Frequency = item.Frequency; 
         memoryRows.MemoriesSWL[k].Time = item.Time; 
         memoryRows.MemoriesSWL[k].Days = item.Days; 
         memoryRows.MemoriesSWL[k].ITU_Station = item.ITU_Station; 
         memoryRows.MemoriesSWL[k].Language_Target_Remarks = item.Language_Target_Remarks; 
         memoryRows.MemoriesSWL[k].Program_Start_Stop = item.Program_Start_Stop; 
         memoryRows.MemoriesSWL[k].ATAUTOinductor = item.ATAUTOinductor; 
         memoryRows.MemoriesSWL[k].ATAUTOcapacitor = item.ATAUTOcapacitor; 
         memoryRows.MemoriesSWL[k].Antenna = item.Antenna; 
         memoryRows.MemoriesSWL[k].Scan = item.Scan; 
         memoryRows.MemoriesSWL[k].AT200PCinductor = item.AT200PCinductor; 
         memoryRows.MemoriesSWL[k].AT200PCcapacitor = item.AT200PCcapacitor; 
         k++; 
        } 

Vielen Dank an diejenigen, die sich Gedanken gemacht und versucht haben zu helfen.

Grüße, Howard

+0

Ich habe alle diese Änderungen rückgängig gemacht und die Sortierung der DataGrid-Spalten deaktiviert, da die ICollectionView das INotifyPropertyChanged scheinbar nicht unterstützt. Ich finde die Arbeit mit Tabellen als PITA mit Java/Swing und VS/WPF. – Howard

Verwandte Themen