Bonjour à tous !

Je souhaite développer un logiciel en WPF en utilisant aussi toutes les nouvelles subtilités du .Net Framework 3.0 et 3.5.

Je vais avoir une base de données. Initialement, j'avais pensé à un fichier Access. Puis je me suis ravisé à utiliser un fichier XML et Linq to Xml associé au Binding.

Voici un exemple du fichier 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
<?xml version="1.0" encoding="utf-8"?>
<especes>
  <data>
    <n_enr.>1 </n_enr.>
    <fam>Acanthaceae</fam>
    <gen>Hygrophilia</gen>
    <esp>Corymbosa</esp>
    <nom>Grand hygrophile</nom>
    <orig>Asie du Sud.</orig>
    <type>2 </type>
    <dif>1 </dif>
    <mil>4 </mil>
    <taimax>30 </taimax>
    <zone>0 </zone>
    <tmin>22 </tmin>
    <tmax>28 </tmax>
    <dgh>20 </dgh>
    <phmin>7 </phmin>
    <phmax>8 </phmax>
    <maint>Solitaire ou en groupe...</maint>
    <soc>3 </soc>
    <nour>3 </nour>
    <repro>2 </repro>
    <des>Tige dressée et brunatre...</des>
    <laq>50 </laq>
    <lum>2 </lum>
    <bra>1 </bra>
    <photo></photo>
  </data></especes>
L'idée étant pour moi de sélectionner dans 3 listbox les familles, les genres et espèces dans le but d'afficher les informations contenues dans le fichier.

J'ai donc procédé à des requêtes Linq To SQL pour obtenir les informations. En voici un exemple :
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
 
        private void lstGen_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            XDocument dataDocument = InitializeDataSource("Data/BIB.xml");
 
 
            System.Xml.XmlElement oSelectedElement = lstGen.SelectedItem as System.Xml.XmlElement;
            if (lstGen.SelectedItem != null)
            {
                var query = (from c in dataDocument.Descendants("data")
                             where ((string)c.Element("gen").Value.ToLower()).Contains(lstGen.SelectedItem.ToString().ToLower())
                             select (string)c.Element("esp").Value).Distinct();
 
                var queryDistinct = Enumerable.Distinct(query);
 
                lstEsp.ItemsSource = queryDistinct;
                //lstDetails.ItemsSource = queryDistinct;
            }
            else lstEsp.ItemsSource = null;
        }
A la base, j'avais utilsé une classe EspeceInfo, qui me permettait de typer les informations à afficher. J'avais trouvé un post hyper pratique permettant de binder directement le datasource du listbox avec le résultat de la requête. Malheureusement, j'ai été incapable de faire du Distinct sur des collections. Je devais faire un Comparer, mais je n'y suis pas parvenu (voir dans le fichier EspeceInfo.cs).

Toujours est-il que j'ai contourné le problème et je ne trouve pas la solution propre.

Pour afficher le détail des données contenues dans le XML, j'ai créé une listBox avec un datatemplate qui reprend les différents champs. Je pense que l'on peut faire plus propre.

Auriez-vous quelques pistes ?

Pour vous aider, vous pouvez télécharger la solution complète là :http://membres.lycos.fr/boujouman/MyReef_dev.com.rar

Merci pour votre aide