Laden...

[WPF] Zelle eines Datagrids in Abhängigkeit anderer Zellwerte berechnen

Erstellt von Caveman vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.109 Views
Caveman Themenstarter:in
187 Beiträge seit 2009
vor 5 Jahren
[WPF] Zelle eines Datagrids in Abhängigkeit anderer Zellwerte berechnen

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:

  1. Wie könnte ich das besser lösen?
  2. Kann man die Aktualisierung der berechneten Spalte auch in dem Moment durchführen, wenn der Focus noch auf der selektierten Zelle liegt?
T
461 Beiträge seit 2013
vor 5 Jahren

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... 😄

1.029 Beiträge seit 2010
vor 5 Jahren

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