Salut à toutes et à tous,

Soit un datagrid lié à un ObserverbleCollection appelé listeMatériel dont le defaultView est défini par un ICollectionView et un ICollectionViewLiveShaping. Cela fonctionne et la datagrid se met bien à jour "en live".

Le problème se trouve au niveau de la mise à jour des regroupements.

Dans le header du regroupement, j'ai le name du regroupement et le nombre d'items "standards", mais j'ai aussi le nombre d'items qui respectent une règle.
J'ai fais cela via un converter.
Lors du chargement du datagrid, le système passe bien par le converter et la valeur écrite est la bonne.
Toutefois, si je modifie un des éléments présents au datagrid pour le changer de groupe, le regroupement se met bien à jour (l'élément change bien de groupe) et le nombre d'items se met à jour. Par contre le système ne passe plus par le converter et le nombre d'éléments répondant à la condition est n'est donc pas mis à jour.

Ci-dessous les différents bouts de codes :

IcollectionView et ICollectionsViewLiveShaping
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
            ICollectionView icvMatériels = CollectionViewSource.GetDefaultView(listeMatériel);            icvMatériels.Culture = System.Globalization.CultureInfo.GetCultureInfo("fr-FR");
            if (icvMatériels != null && icvMatériels.CanGroup == true)
            {
                icvMatériels.GroupDescriptions.Clear();
                icvMatériels.GroupDescriptions.Add(new PropertyGroupDescription("Catégorie"));
                icvMatériels.GroupDescriptions.Add(new PropertyGroupDescription("Description"));
            }
            if (icvMatériels != null && icvMatériels.CanSort == true)
            {
                icvMatériels.SortDescriptions.Clear();
                icvMatériels.SortDescriptions.Add(new SortDescription("Catégorie", ListSortDirection.Ascending));
                icvMatériels.SortDescriptions.Add(new SortDescription("Description", ListSortDirection.Ascending));
                icvMatériels.SortDescriptions.Add(new SortDescription("Détails", ListSortDirection.Ascending));
                icvMatériels.SortDescriptions.Add(new SortDescription("LocalisationDate", ListSortDirection.Ascending));
            }
            ICollectionViewLiveShaping icvMatérielsLiveShaping = (ICollectionViewLiveShaping)CollectionViewSource.GetDefaultView(listeMatériel);
            if (icvMatérielsLiveShaping.CanChangeLiveSorting)
            {
                icvMatérielsLiveShaping.LiveGroupingProperties.Add("Catégorie");
                icvMatérielsLiveShaping.LiveGroupingProperties.Add("Description");
                icvMatérielsLiveShaping.LiveGroupingProperties.Add("Détails");
                icvMatérielsLiveShaping.LiveGroupingProperties.Add("LocalisationDate");
                icvMatérielsLiveShaping.IsLiveGrouping = true;
            }
            if (icvMatérielsLiveShaping.CanChangeLiveGrouping)
            {
                icvMatérielsLiveShaping.LiveSortingProperties.Add("Catégorie");
                icvMatérielsLiveShaping.LiveSortingProperties.Add("Description");
                icvMatérielsLiveShaping.LiveSortingProperties.Add("Détails");
                icvMatérielsLiveShaping.LiveSortingProperties.Add("LocalisationDate");
                icvMatérielsLiveShaping.IsLiveSorting = true;
            }
Converter
(Il est sans doute loin d'être parfait. C'est mon premier. Néanmoins il fonctionne quand le code passe dessus)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    public class GroupsToTotalQMConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            //System.Diagnostics.Debugger.Break();
            Type test = value.GetType();
            if (value is System.Windows.Data.CollectionViewGroup && parameter is string)
            {
 
 
                System.Windows.Data.CollectionViewGroup group = value as System.Windows.Data.CollectionViewGroup;
 
 
                var items = (value as System.Windows.Data.CollectionViewGroup).Items;
                Decimal totalQM = 0;
                foreach (var item in items)
                {
                    if (item is Matériel)
                    {
                        if (item != null && (item as Matériel).LocalisationLieu.ToString() == "QM")
                            totalQM++;
                        continue;
                    }
 
 
                    var lastLevel = item;
                    while (!(lastLevel as System.Windows.Data.CollectionViewGroup).IsBottomLevel)
                    {
                        lastLevel = (lastLevel as System.Windows.Data.CollectionViewGroup).Items;
                    }
                    ReadOnlyObservableCollection<Object> elements = (lastLevel as System.Windows.Data.CollectionViewGroup).Items;
                    foreach (var element in elements)
                    {
                        Matériel materiel = element as Matériel;
                        if (materiel != null && materiel.LocalisationLieu.ToString() == "QM")
                            totalQM++;
                    }
                }
                return totalQM.ToString();
 
 
            }
            return "0";
        }

XAML du Header de groupe du datagrid
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
                                                        <Expander.Header>
                                                            <DockPanel>
                                                                <TextBlock FontWeight="Bold" Margin="5,0,0,0" Width="Auto" Background="Transparent">
                                                                    <TextBlock.Text>
                                                                        <MultiBinding StringFormat=" {0} ({1} dont {2} au QM)">
                                                                            <Binding Path="Name"/>
                                                                            <Binding Path="ItemCount"/>
                                                                            <Binding Converter="{StaticResource groupsToTotalQMConverter}" ConverterParameter="Name"/>
                                                                        </MultiBinding>
                                                                    </TextBlock.Text>
                                                                </TextBlock>
                                                            </DockPanel>
                                                        </Expander.Header>

Ce que cela donne :

Au départ les nombres sont bons :
Nom : Datagrid1.jpg
Affichages : 112
Taille : 18,8 Ko

Si on change un boussole de catégorie vers la catégorie "Autres" :
Comme la catégorie "Autre" n'était pas au datagrid, le calcul se fait bien, par contre le nombre de boussoles dans la catégorie "Orientation" ne passe plus par le converter. Le nombre ne change donc plus :
Nom : Datagrid2.jpg
Affichages : 115
Taille : 18,2 Ko

Si on change une seconde boussole de catégorie de nouveau vers la catégorie "Autres" :
Comme la catégorie "Autres" et la catégorie "Orientation" existent toutes les 2, le converter n'est plus utilisé dans aucune des 2. Les 2 nombres sont donc erronés :
Nom : Datagrid3.jpg
Affichages : 110
Taille : 18,1 Ko


Pourquoi ne passe-t-il plus par le converter ?
que devrais-je faire pour régler cela ?

Merci de z'avis z'avisés,
JM