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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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