IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Lier xmldocument avec XmlDataProvider


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut Lier xmldocument avec XmlDataProvider
    Bonjour,

    Je cherche à lier mon interface utilisateur à un document xml situé dans le dossier du programme, pour cela je fais dans mon fichier xaml :

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     <Window x:Class="FenetreConfiguration.ConfigDialog"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:src="clr-namespace:FenetreConfiguration"
            Title="Configuration" Height="350" Width="525" Loaded="Window_Loaded">
        <Window.Resources>
            <XmlDataProvider x:Key="ConfigData" />
        </Window.Resources>
        <Grid DataContext="{Binding Source={StaticResource ConfigData}, XPath=Elements}">
        <!-- code -->
      </Grid>
    </Window>



    Et dans mon code :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        public partial class ConfigDialog : Window
        {
           XmlDocument doc = new XmlDocument();
     
           private void Window_Loaded(object sender, RoutedEventArgs e)
           {
                doc.Load("Configuration.xml");
                XmlDataProvider xmlDataProvider = this.FindResource("ConfigData") as XmlDataProvider;
                if (xmlDataProvider != null)
                {
                    xmlDataProvider.Document = doc;
                    xmlDataProvider.XPath = "Configuration";
                }
           }
        }

    Donc, jusque là ça marche très bien, mais j'aimerai suprimer la liaison au doc dans le code pour la mettre à l'intérieur du code xaml...

    Bref, remplacer cette partie là

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        XmlDataProvider xmlDataProvider = this.FindResource("ConfigData") as XmlDataProvider;
        if (xmlDataProvider != null)
        {
            xmlDataProvider.Document = doc;
            xmlDataProvider.XPath = "Configuration";
        }

    par du code xaml
    Et là, je n'y arrive pas, aussi si quelqu'un a une idée, je suis preneur.

    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    As-tu essayer la propriété Source de ton XmlDataProvider ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut
    Oui, j'ai essayé, lorsque j'essaie d'utiliser la propriété source, donc en définissant un data context au niveau de mon code
    Code c# : 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
    public class ViewModel 
    {
        private XmlDocument doc = new XmlDocument();
        public XmlDocument Doc { set { doc = value; } get { return doc; } }
    }
     
    public partial class ConfigDialog : Window
    {
        ViewModel view = new ViewModel();
     
        public ConfigDialog()
        {
            InitializeComponent();
        }
     
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            view.Doc.Load("Configuration.xml");
            this.DataContext = view;
        }
     
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            view.Doc.Save("Configuration.xml");
        }
    }

    Impossible de définir la source à l'aide d'un binding
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Window.Resources>
        <XmlDataProvider x:Key="ConfigData" Source="{Binding Path=doc}"/>
    </Window.Resources>
    Cela créé l'exception :
    Impossible de définir 'Binding' sur la propriété 'Source' de type 'XmlDataProvider'. Un 'Binding' ne peut être défini que sur un DependencyProperty d'un DependencyObject.
    Si je définis la source avec un chemin d'acces relatif du type
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
     <XmlDataProvider x:Key="ConfigData" Source="Configuration.xml"/>
    Mon résultat est une fenetre vide de données.
    Si je mets le chemin complet, alors je récupère bien mes données, mais outre le fait que cela ne m'intéresse pas de récupérer les données avec un chemin complet, je serais obligé pour sauvegarder de réécrire des lignes de codes considérant la key du dataprovider pour récupérer le xmldocument modifié du xmldataprovider (l'enregistrement sur le fichier xml ne se faisant pas directement, seul une instance de l'objet représentant le document xml est modifié en temps réel), ce que je préfère éviter (sinon autant rester dans ma situation initial).

    Pas plus de résultat si j'utilise la propriété document.

    Bien sur, débutant en wpf, il est probable que j'ai fait n'importe quoi, aussi, je vous serais reconnaissant de m'expliquer plus en détail une maniere de définir la source.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Normal, la propriété Source n'est pas une propriété de dépendance et n’appartient pas en plus à un objet de dépendance.

    Je vois que tu utilises le pattern MVVM alors j'en profite pour te rappeler que ce dernier n'interdit pas le fait qu'on mette du code dans la Vue n'est pas un mal. Le pattern est juste là pour réduire les lignes de code dans la Vue.

    Si j'étais le code que t'avais mis dans ton premier post est très bien.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut
    J'ai un peu changé par rapport à mon premier code (même s'il était correct), en supprimant le XmlDataProvider, est ce mieux ainsi ou vaut il mieux que je retourne à mon premier code ?

    Code c# : 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
      public partial class ConfigDialog : Window
        {
            ViewModel model = new ViewModel();
     
            public ConfigDialog()
            {
                InitializeComponent();
            }
     
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
               model.Doc.Load("Configuration.xml");
              this.DataContext = model;
            }
     
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                    model.Doc.Save("Configuration.xml");
                    this.Close();
            }
        }
     
        class ViewModel
        {
            private XmlDocument doc=new XmlDocument();
            public XmlDocument Doc { set { doc = value; } get { return doc; } }
     
        }
    }

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <Window x:Class="FenetreConfiguration.ConfigDialog"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:src="clr-namespace:FenetreConfiguration"
            Title="Configuration" Height="350" Width="525" Loaded="Window_Loaded">
        <Grid Name="Grid1" DataContext="{Binding Path=Doc}">

    Les deux fonctionnent aussi bien, le deuxieme me semble mieux puisqu'il me semble qu'il sépare plus le code de l'interface utilisateur mais je ne saurais l'affirmer avec certitude.

  6. #6
    Invité
    Invité(e)
    Par défaut
    La dernière solution te permet de faire du binding sur ton objet XmlDocument ce qui est impossible avec la propriété Source de ton XmlDataProvider donc j'adhère avec cette solution.

    Par contre faudra migrer le gestionnaire d'évènements Click dans ton View Model et utiliser les Command pour déclencher l'évènement associé. Tu peux une commande pour faire de même pour l’évènement Loaded de ton formulaire et avoir au final moins de code-behind dans ce dernier.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut
    Merci pour tes réponses jusque là.
    Donc j'utilise la derniere solution.
    Par contre, je ne sais pas lier le clic du bouton à la fermeture de la fenetre, et je lance aussi une fenetre de confirmation avant l'enregistrement.
    Aussi pour le moment, mon code ressemble à :

    Code c# : 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
        public partial class ConfigDialog : Window
        {
            ViewModel model = new ViewModel();
     
            public ConfigDialog()
            {
                InitializeComponent();
                this.DataContext = model;
            }
     
            private void buttonSave_Click(object sender, RoutedEventArgs e)
            {
                MessageBoxResult result= MessageBox.Show("Ceci enregistrera les modifications.", "Etes vous sur?", MessageBoxButton.OKCancel,MessageBoxImage.Warning);
                if (result == MessageBoxResult.OK)
                {
                    model.save();
                    this.Close();
                }
            }
     
            private void buttonAnnule_Click(object sender, RoutedEventArgs e)
            {
                this.Close(); 
            }
        }
     
        class ViewModel
        {
            public XmlDocument Doc { set; get; }
     
            public ViewModel()
            {
                Doc = new XmlDocument();
                Doc.Load("Configuration.xml");
            }
     
            public void save()
            {
                Doc.Save("Configuration.xml");
            }
        }

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <Window x:Class="FenetreConfiguration.ConfigDialog"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Configuration" Height="350" Width="525" Name="WindowConfig">
        <Grid DataContext="{Binding Path=Doc}">
     
     
                <Button Content="Annuler" Name="buttonAnnule" Click="buttonAnnule_Click" />
                <Button Content="Ok"  Name="buttonSave" Click="buttonSave_Click" />
     
     
         </Grid>
    </Window>

    Comment puis je au moins lié le bouton annuler à la fermeture de la fenetre sans code behind ?
    Comment lier le bouton save avec toutes les actions derrière là aussi sans code behind ? (Là peut être un peu plus compliqué, je laisserai peut être comme ça cette partie)

  8. #8
    Invité
    Invité(e)
    Par défaut
    Je n'ai pas bien compris ce que tu peux faire. Dans la méthode buttonAnnule_Click tu fais appel juste à l'instruction de fermeture de la fenêtre alors ce n'est pas du tout intéressant de la rattacher à l 'évènement de fermeture de la fenêtre vu que this.Close() est appelée implicitement lorsque tu fais ALT+F4 ou que tu cliques sur le bouton de fermeture.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut
    Le bouton annuler est équivalent à un bouton Quitter sans sauvegarder.
    Je suis tout à fait d'accord qu'il est bête de l'attacher à buttonAnnule_Click mais je ne vois pas comment le rattacher directement à this.Close()

  10. #10
    Invité
    Invité(e)
    Par défaut
    Vu que tu y tiens alors tu modifies dans ton fichier XAML l'élément Window en y ajoutant ça : Closing="buttonAnnule_Click".

  11. #11
    Invité
    Invité(e)
    Par défaut
    Je pense que le plus clean sera de d'afficher une boîte de dialogue à l'utilisateur s'il veut vraiment :
    • sauvegarder,
    • annuler et rester sur la fenêtre,
    • tout simplement quitter sans sauvegarder.

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut
    En fait, cette partie du code représente déja une boite de dialogue pour les parametres d'une application un peu plus développée.

    Cette représentation

    avec 2 bouttons me semble plus intuitif qu'avec un seul bouton qui ouvrirait un message box avec 3 choix.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Access] lier table avec formulaire
    Par Fabious dans le forum IHM
    Réponses: 6
    Dernier message: 11/08/2008, 00h17
  2. Lier Tomcat5 avec apache2.0
    Par nihad510 dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 24/04/2008, 12h42
  3. lier vb avec acces
    Par belakhdarbts10 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 26/04/2007, 19h47
  4. comment lier eclipse avec Xampp pour travailler avec php
    Par metrax dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 14/03/2007, 13h23
  5. Filtrage : lier comboBox avec sous formulaire
    Par sunvialley dans le forum Access
    Réponses: 7
    Dernier message: 04/05/2006, 16h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo