[Debutant] - WPF MVVM Binding XML in Treeview
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:
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:
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:
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:
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