Hallo,
ich habe ein Datagrid, das an eine DataTable gebunden ist. Die DataTable habe ich deswegen gewählt, da sich da am einfachsten sowohl Spalten als auch Zeilen hinzufügen oder entfernen lassen.
Das Datagrid besteht aus zwei Spalten vom Typ string, der Rest sind Spalten vom Typ bool.
Mein Ziel ist es, in der zweiten Textspalte die Anzahl der wahren bool Werte darzustellen.
Nachdem ich nun seit mehreren Tagen rumprobiert und gegoogelt habe, bin ich auf folgende, aber nicht ganz zufriedenstellende Lösung gekommen.
Auszug aus der View:
<Grid Name="grid">
<DataGrid Name="datagrid" ItemsSource="{Binding Collection2}" AutoGenerateColumns="true" IsSynchronizedWithCurrentItem="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="CellEditEnding">
<i:InvokeCommandAction Command="{Binding CurrentCellEditEndingCommand}" CommandParameter="{Binding ElementName=datagrid, Path=CurrentItem}" />
</i:EventTrigger>
<i:EventTrigger EventName="CurrentCellChanged">
<i:InvokeCommandAction Command="{Binding CurrentCellChangedCommand}" CommandParameter="{Binding ElementName=datagrid}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</DataGrid>
</Grid>
Und der Auszug aus dem zugehörigen ViewModel:
private DataTable table;
public DataView Collection2 { get { return table.DefaultView; } }
private void OnCurrentCellEditEnding(object obj)
{
if (obj is DataRowView)
{
editingRow = obj as DataRowView;
}
}
private void OnCurrentDataGridCellChanged(object obj)
{
if (editingRow != null && (obj is DataGrid))
{
if (editingRow.IsEdit)
{
DataGrid dataGrid = obj as DataGrid;
dataGrid.CommitEdit(DataGridEditingUnit.Row, true);
dataGrid.BeginEdit();
editingRow.Row["Users in Group"] = string.Format(format, CalculateUsers(editingRow.Row), 6);
dataGrid.CommitEdit(DataGridEditingUnit.Row, true);
}
}
}
Das grundsätzliche Problem ist, dass die DataRowView erst aktualisiert wird, wenn ein Commit auf die ganze Zeile des Datagrids erfolgt. Deswegen wird nach dem ersten Commit die Zeile wieder in den Bearbeitungsmodus gesetzt, die Anzahl der wahren Boolwerte errechnet und erneut ein Commit auf die Zeile ausgeführt.
Meine Fragen dazu:
Hallo, die DataTable
im Hintergrund ist etwas umständlich für dieses Vorgehen...
Erstelle DataBinding-Objekte die den Inhalt (Zeilen/Tabelle) repräsentieren.
Danach kann man voll leicht deine Anforderungen umsetzen --> alles Background ohne direkten Eingriff in das UI....
Grüß
Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄
Hi,
DataTables bzw. deren Columns verfügen im Normalfall über die Eigenschaft "Expression" - da die Berechnung nicht sonderlich kompliziert aussieht - würde ich eher versuchen das darüber abzubilden... Siehe https://msdn.microsoft.com/de-de/library/system.data.datacolumn.expression(v=vs.110).aspx
LG