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?
Wenn der Benutzer eine Spalte sortieren, die ObservableCollection anstelle der Daten im Datagrid sortiert. – jdweng
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
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