21 messaggi dal 27 dicembre 2011
Ciao,

ho un problema con un datagrid raggruppato.
Nel raggruppamento del datagrid devo far vedere i totali di quel gruppo di elementi,fin qui poco male (nel senso che riesco a far vedere i totali bindando direttamente gli items del gruppo e passandoli ad un converter)

Qui il codice, magari può essere di aiuto a qualcuno

  <TextBlock Grid.Column="1"
                   HorizontalAlignment="Left"
                   VerticalAlignment="Center"
                   FontSize="12"
                   Foreground="#998A8E"                                                           
                   Text="{Binding Items, Converter={StaticResource sumConverter}, UpdateSourceTrigger=PropertyChanged}" />


Gli elementi del gruppo hanno una property (Quantità) che posso variare direttamente dal datagrid. Il problema è che quando cambio la quantità il totale del gruppo non mi si aggiorna automaticamente.
Ho trovato un modo, ma è una "pezza" (o magari no) che non mi piace molto, in pratica ricreo il raggruppamento, in tal modo riesco ad aggiornare il totale.

C'è qualcos'altro che posso fare?
Modificato da marco.morgia83 il 24 agosto 2018 18.17 -
11.097 messaggi dal 09 febbraio 2002
Contributi
Ciao Marco,
quando crei un binding con un'oggetto, la UI potrà essere notificata dei cambiamenti solo se questo oggetto implementa INotifyPropertyChanged o, se si tratta di una lista come nel tuo caso, se implementa INotifyCollectionChanged.

Quindi, prendiamo il tuo binding:
Text="{Binding Items, Converter={...


Se Items implementa INotifyCollectionChanged (es. è una ObservableCollection<T>), puoi variare solo un elemento della lista (es.
usando il metodo Set
) per costringere la UI a ricalcolare il binding.

Questo è l'approccio che ti darà buoni risultati prestazionali. Infatti, variare un solo risultato della collezione è preferibile non tanto per il calcolo del totale, che deve comunque prenderli in considerazione tutti, ma per il rendering di quegli items nella lista.

Secondo me, però, una soluzione ancora migliore sarebbe quella di mettere a disposizione una proprietà "Total" nello stesso oggetto che contiene la proprietà "Items". L'oggetto, che implementerà INotifyPropertyChanged, notificherà alla UI che la proprietà Total è cambiata.
Se introduci una proprietà Total, potrai aggiornare il binding in questo modo:
Text="{Binding Total}"

Così non dovrai toccare la lista.

ciao,
Moreno
Modificato da BrightSoul il 26 agosto 2018 10.14 -

Enjoy learning and just keep making
21 messaggi dal 27 dicembre 2011
Ciao,

in realtà Items non è una mia property, ma è la property interna del DataGrid. In pratica il datagrid prende in automatico solo gli Items di quel raggruppamento.

Io ho un ViewModel che ha all'interno una ObeservableCollection<Prodotti>, che hanno (a titolo di esempio) le property Quantità e TotalePrezzo.
Se introduco una proprietà Total a livello di ViewModel sicuramente funziona, ma dovrei farmi io la somma in base al raggruppamento, volevo quindi sfruttare le funzioni del datagrid per lasciare al datagrid stesso l'onere del calcolo.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.