bonjour
Je reviens une nouvelle fois vers vous pour une question que je n'arrive pas à résoudre tout seul

J'aimerais construire un treeview en fonction des enregistrements que je fais

mon XML :
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Enregistrements>
  <Enregistrement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" TypeEnregistrement="APS" Batiment="A" Etage="RdC" Local="C" Y="0,8" K="1" VitessePlb="1,5">
    <aps Id="1" Profil="Standard" Nom="WC avec reservoir" DebitUnitaire="0.12" CoefficientAPSIndividuel="0.5" EF="true" EC="false" />
    <aps Id="2" Profil="Standard" Nom="Urinoir avec robinet individuel" DebitUnitaire="0.15" CoefficientAPSIndividuel="0.5" EF="true" EC="false" />
    <aps Id="3" Profil="Standard" Nom="Urinoir à action siphonique" DebitUnitaire="0.5" CoefficientAPSIndividuel="1" EF="true" EC="false" />
    <aps Id="4" Profil="Standard" Nom="Lavabo collectif" DebitUnitaire="0.05" CoefficientAPSIndividuel="0.5" EF="true" EC="true" />
    <aps Id="5" Profil="Standard" Nom="Lavabo / Vasque" DebitUnitaire="0.2" CoefficientAPSIndividuel="1.5" EF="true" EC="true" />
    <aps Id="6" Profil="Standard" Nom="Lave mains" DebitUnitaire="0.1" CoefficientAPSIndividuel="0.5" EF="true" EC="true" />
    <aps Id="7" Profil="Standard" Nom="Douche" DebitUnitaire="0.2" CoefficientAPSIndividuel="2" EF="true" EC="true" />
    <aps Id="8" Profil="Standard" Nom="Baignoire" DebitUnitaire="0.2" CoefficientAPSIndividuel="3" EF="true" EC="true" />
    <aps Id="9" Profil="Standard" Nom="Evier" DebitUnitaire="0.2" CoefficientAPSIndividuel="2.5" EF="true" EC="true" />
    <aps Id="10" Profil="Standard" Nom="Lave vaiselle" DebitUnitaire="0.1" CoefficientAPSIndividuel="1" EF="true" EC="false" />
    <aps Id="11" Profil="Standard" Nom="Lave linge" DebitUnitaire="0.2" CoefficientAPSIndividuel="1" EF="true" EC="false" />
    <aps Id="12" Profil="Standard" Nom="Robinet de puisage" DebitUnitaire="0.33" CoefficientAPSIndividuel="2" EF="true" EC="false" />
    <aps Id="13" Profil="Standard" Nom="Bouche incongelable" DebitUnitaire="0.33" CoefficientAPSIndividuel="2" EF="true" EC="false" />
    <aps Id="14" Profil="Standard" Nom="Vidoir / Poste d'eau" DebitUnitaire="0.33" CoefficientAPSIndividuel="2" EF="true" EC="true" />
    <aps Id="15" Profil="Standard" Nom="Autre" DebitUnitaire="0" CoefficientAPSIndividuel="0" EF="false" EC="false" />
  </Enregistrement>
  <Enregistrement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" TypeEnregistrement="APS" Batiment="B" Etage="RdC" Local="rerre" Y="0,8" K="1" VitessePlb="1,5">
    <aps Id="1" Profil="Standard" Nom="WC avec reservoir" DebitUnitaire="0.12" CoefficientAPSIndividuel="0.5" EF="true" EC="false" Quantite="10" />
    <aps Id="2" Profil="Standard" Nom="Urinoir avec robinet individuel" DebitUnitaire="0.15" CoefficientAPSIndividuel="0.5" EF="true" EC="false" Quantite="0" />
    <aps Id="3" Profil="Standard" Nom="Urinoir à action siphonique" DebitUnitaire="0.5" CoefficientAPSIndividuel="1" EF="true" EC="false" Quantite="0" />
    <aps Id="4" Profil="Standard" Nom="Lavabo collectif" DebitUnitaire="0.05" CoefficientAPSIndividuel="0.5" EF="true" EC="true" Quantite="0" />
    <aps Id="5" Profil="Standard" Nom="Lavabo / Vasque" DebitUnitaire="0.2" CoefficientAPSIndividuel="1.5" EF="true" EC="true" Quantite="0" />
    <aps Id="6" Profil="Standard" Nom="Lave mains" DebitUnitaire="0.1" CoefficientAPSIndividuel="0.5" EF="true" EC="true" Quantite="0" />
    <aps Id="7" Profil="Standard" Nom="Douche" DebitUnitaire="0.2" CoefficientAPSIndividuel="2" EF="true" EC="true" Quantite="0" />
    <aps Id="8" Profil="Standard" Nom="Baignoire" DebitUnitaire="0.2" CoefficientAPSIndividuel="3" EF="true" EC="true" Quantite="0" />
    <aps Id="9" Profil="Standard" Nom="Evier" DebitUnitaire="0.2" CoefficientAPSIndividuel="2.5" EF="true" EC="true" Quantite="0" />
    <aps Id="10" Profil="Standard" Nom="Lave vaiselle" DebitUnitaire="0.1" CoefficientAPSIndividuel="1" EF="true" EC="false" Quantite="0" />
    <aps Id="11" Profil="Standard" Nom="Lave linge" DebitUnitaire="0.2" CoefficientAPSIndividuel="1" EF="true" EC="false" Quantite="0" />
    <aps Id="12" Profil="Standard" Nom="Robinet de puisage" DebitUnitaire="0.33" CoefficientAPSIndividuel="2" EF="true" EC="false" Quantite="0" />
    <aps Id="13" Profil="Standard" Nom="Bouche incongelable" DebitUnitaire="0.33" CoefficientAPSIndividuel="2" EF="true" EC="false" Quantite="0" />
    <aps Id="14" Profil="Standard" Nom="Vidoir / Poste d'eau" DebitUnitaire="0.33" CoefficientAPSIndividuel="2" EF="true" EC="true" Quantite="0" />
    <aps Id="15" Profil="Standard" Nom="Autre" DebitUnitaire="0" CoefficientAPSIndividuel="0" EF="false" EC="false" Quantite="0" />
  </Enregistrement>
  <Enregistrement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" TypeEnregistrement="APS" Batiment="B" Etage="R+1" Y="0,8" K="1" VitessePlb="1,5">
    <aps Id="1" Profil="Standard" Nom="WC avec reservoir" DebitUnitaire="0.12" CoefficientAPSIndividuel="0.5" EF="true" EC="false" Quantite="10" />
    <aps Id="2" Profil="Standard" Nom="Urinoir avec robinet individuel" DebitUnitaire="0.15" CoefficientAPSIndividuel="0.5" EF="true" EC="false" Quantite="0" />
    <aps Id="3" Profil="Standard" Nom="Urinoir à action siphonique" DebitUnitaire="0.5" CoefficientAPSIndividuel="1" EF="true" EC="false" Quantite="0" />
    <aps Id="4" Profil="Standard" Nom="Lavabo collectif" DebitUnitaire="0.05" CoefficientAPSIndividuel="0.5" EF="true" EC="true" Quantite="0" />
    <aps Id="5" Profil="Standard" Nom="Lavabo / Vasque" DebitUnitaire="0.2" CoefficientAPSIndividuel="1.5" EF="true" EC="true" Quantite="0" />
    <aps Id="6" Profil="Standard" Nom="Lave mains" DebitUnitaire="0.1" CoefficientAPSIndividuel="0.5" EF="true" EC="true" Quantite="0" />
    <aps Id="7" Profil="Standard" Nom="Douche" DebitUnitaire="0.2" CoefficientAPSIndividuel="2" EF="true" EC="true" Quantite="0" />
    <aps Id="8" Profil="Standard" Nom="Baignoire" DebitUnitaire="0.2" CoefficientAPSIndividuel="3" EF="true" EC="true" Quantite="0" />
    <aps Id="9" Profil="Standard" Nom="Evier" DebitUnitaire="0.2" CoefficientAPSIndividuel="2.5" EF="true" EC="true" Quantite="0" />
    <aps Id="10" Profil="Standard" Nom="Lave vaiselle" DebitUnitaire="0.1" CoefficientAPSIndividuel="1" EF="true" EC="false" Quantite="0" />
    <aps Id="11" Profil="Standard" Nom="Lave linge" DebitUnitaire="0.2" CoefficientAPSIndividuel="1" EF="true" EC="false" Quantite="0" />
    <aps Id="12" Profil="Standard" Nom="Robinet de puisage" DebitUnitaire="0.33" CoefficientAPSIndividuel="2" EF="true" EC="false" Quantite="0" />
    <aps Id="13" Profil="Standard" Nom="Bouche incongelable" DebitUnitaire="0.33" CoefficientAPSIndividuel="2" EF="true" EC="false" Quantite="0" />
    <aps Id="14" Profil="Standard" Nom="Vidoir / Poste d'eau" DebitUnitaire="0.33" CoefficientAPSIndividuel="2" EF="true" EC="true" Quantite="0" />
    <aps Id="15" Profil="Standard" Nom="Autre" DebitUnitaire="0" CoefficientAPSIndividuel="0" EF="false" EC="false" Quantite="0" />
    <apschasse Id="25" Profil="Standard" Nom="WC avec robinet de chasse" DebitUnitaire="1.5" EF="true" QuantiteChasse="0" />
    <apschasse Id="26" Profil="Standard" Nom="Autre avec robinet de chasse" DebitUnitaire="0" EF="true" QuantiteChasse="0" />
  </Enregistrement>
 
</Enregistrements>
Mon Model :
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
 
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Text.RegularExpressions;
using Apeiron.Properties;
using System.Xml.Serialization;
using System.Collections.ObjectModel;
 
namespace Apeiron.Model
{
    [XmlRoot]
    [Serializable]
    public class Enregistrement // Save Sanitary devices
    {
        [XmlAttribute]
        public string TypeEnregistrement { get; set; }
        [XmlAttribute]
        public string Batiment { get; set; }
        [XmlAttribute]
        public string Etage { get; set; }
        [XmlAttribute]
        public string Local { get; set; }
        [XmlAttribute]
        public string Y { get; set; }
        [XmlAttribute]
        public string K { get; set; }
        [XmlAttribute]
        public string VitessePlb { get; set; }
        [XmlElement]
        public Collection<APS> aps { get; set; }
        [XmlElement]
        public Collection<APSCHASSE> apschasse { get; set; }
 
 
    }
}
mon DataAccess
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
 
namespace Apeiron.DataAccess
{
    class EnregistrementXmlProvider : IDataEnregistrement<Enregistrement>
    {
        private readonly XDocument doc;
        private readonly string xmlFilePath;
 
        public EnregistrementXmlProvider(string xmlFilePath)
        {
            this.xmlFilePath = xmlFilePath;
            doc = XDocument.Load(xmlFilePath);
        }
        public void Add(Enregistrement entity)
        {
            var element = entity.ToXElement<Enregistrement>();
            doc.Root.Add(element);
            doc.Save(xmlFilePath);
        }
        public IEnumerable<string> GetBatiment()
        { 
         return doc.Descendants("Enregistrement").Where(s => s.Attribute("TypeEnregistrement").Value == "APS").Select(s => s.Attribute("Batiment").Value).Distinct();
        }
        public IEnumerable<Enregistrement> GetAll()
        {
            return doc.Descendants("Enregistrement").Select(element => element.FromXElement<Enregistrement>());
        }
    }
}
Par contre je commence à coincer au niveau de mon ViewModel et de ma View

Mon ViewModel
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
 
 public void SaveLocal()
        {
            var NouvelEnregistrement = new Enregistrement
            {
                TypeEnregistrement = "APS",
                Batiment = Batiment,
                Etage = Etage,
                Local = Local, 
                Y = Y.ToString(),
                K = K.ToString(),
                VitessePlb = VitessePlb.ToString(),
                aps = Aps,
                apschasse = ApsChasse
            };
            EnregistrementProvider.Add(NouvelEnregistrement);
            var getallenregistrement = EnregistrementProvider.GetAll();
           Enregistrement = new ObservableCollection<Enregistrement>(getallenregistrement);
             var getallenregistrement = EnregistrementProvider.GetAll();
            ListBatiment = Enregistrement.Where(s => s.TypeEnregistrement == "APS").Select(s => s.Batiment).Distinct().ToList();

mon treeview voulu :

Le nom des bâtiments en distinct()
Les etages en fonction du nom des bâtiments en distinct()
et les nom des locaux


> Batiment A
>RdC
> Nom Local 1
> nom et quantité aps & apschasse en fonction que quantité <> 0
> Etc (s'il existe)
>Etc (s'il existe)
> Batiment B
> RdC
> Nom Local 1
> Nom Local 2
> Etc (s'il existe)
> R+1
> Nom Local 1
> Nom Local 2
> Etc (s'il existe)
>Etc (s'il existe)


J'ai trouvé cela sur internet : https://www.codeproject.com/articles...g-the-viewmode

Cela correspondrait plutôt pas mal à ce que je voudrais faire mais je ne sais pas trop comment adapter les différentes classes par rapport à ma classe ENREGISTREMENT.

Pouvez vous m'aider s'il vous plait.
En vous remerciant par avance