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 Phone .NET Discussion :

La liaison de données Source-cible [Windows Phone 8]


Sujet :

Windows Phone .NET

  1. #1
    Nouveau membre du Club
    Inscrit en
    janvier 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 43
    Points : 28
    Points
    28
    Par défaut La liaison de données Source-cible
    Bonjour,

    je suis débutant sur Windows phone et j'ai un peu du mal à comprendre la liaison de donnée surtout dans le cas qui est le mien en fait.

    A ce jour mon appli se présente en un ensemble de vue que j'aimerai relier à des classes qui sont mes ViewModels.
    Voici la ViewModel Personne (simplifiée):

    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
    public class Personne : INotifyPropertyChanged  
        {
     
            public string Id {get; set;}
            public string DisplayName {get; set;}
            public string FamilyName {get; set;}
            public string GivenName { get; set; }
            public string Email { get; set; }
            public string FixedLineNumber { get; set; }
            public string FixedLineShortNumber { get; set; }
            public string MobilePhoneNumber { get; set; }
     
            public Personne()
            {
            }
     
            public Personne(string xml, TypePersonne typePersonne)
            {
     
                if(string.IsNullOrEmpty(xml))
                    return;
                XElement xResultat = XElement.Parse(xml);
                this.Email = xResultat.Element("Mail").Value;
                this.MobilePhoneNumber = xResultat.Element("NumMobile").Value;
                this.DisplayName = xResultat.Element("NomAffichage").Value;
                this.FamilyName = xResultat.Element("Nom").Value;
                this.GivenName = xResultat.Element("Prenom").Value;
                this.Id = xResultat.Element("Matricule").Value;
                this.FixedLineNumber = xResultat.Element("NumFixe").Value;
     
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            private void NotifyPropertyChanged(String propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (null != handler)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    Je souhaite relier ces données à ma page xaml...J'aimerai le faire depuis la page xaml même, en référançant la classe Personne...Je ne veux pas le faire en définissant le DataContext dans ma classe.

    Voci mon xaml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <phone:PhoneApplicationPage 
        x:Class="AnnuaireBytel.Views.DetailPers"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="728"
     
        xmlns:local="clr-namespace:AnnuaireBytel.ViewModels"
     
       >

    J'aimerai dans l'idéal lié globalement mon xaml à ma classe Personne(ou plus justement à une instance) et après j'aurai qu'à binder sur les propriétés qui m'intéresse pour chaque élément dans ma vue...

    Qu'est ce que vous me conseillez ?

    Merci d'avance,

  2. #2
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : août 2003
    Messages : 1 986
    Points : 1 450
    Points
    1 450
    Par défaut
    Hello,

    vu que tu as l'air de partir sur du MVVM, je te conseilles de regarder du côté de MVVM Light Toolkit.

    ça devrait et permettre de résodure ton problème
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  3. #3
    Nouveau membre du Club
    Inscrit en
    janvier 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    J'ai du mal à voir qu'est ce qui dans mon appli est le model et qu'est ce qui le ViewModel...
    La classe Personne ci dessus que représente t elle ?

    Sinon je suis sur Visual studio 2013 et Mvvm light n'est pas compatible avec...
    Mais je comprend pas pourquoi tu dis que je fais du MVVM...
    je pensais que c'était qu'un pattern d'architecture comme le MVC en ASP.net.
    J'ai lu que il fallait utiliser des framework comme Prism...mais j'utilise rien de tout ça moi...jcomprend plus rien...Help !!!

    Voici une réponse mais c'est dans le code behind

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     LayoutRoot.DataContext = laPersonne(instance de ma classe);

  4. #4
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : août 2003
    Messages : 1 986
    Points : 1 450
    Points
    1 450
    Par défaut
    Hello,

    Le Model c'est ta classe personne.
    Le ViewModel c'est une classe qui manipule ton Model pour les mettre au bon format pour la View.

    MVVM Light semble fonctionner sous VS 2013 car je n'ai pas eu de soucis en passant par Nuget !

    Après PRISM c'est aussi du MVVM mais c'est uen usine à gaz par rapport à MVVM Light.

    Après dans le fonctionnement MVVM Light dispose d'un Locator qui permet de répertorier les ViewModels et de les binder sur les vues (dans le xaml) avec ce genre de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    <DataContext={Binding Path=MonViewModel, Source={StaticResource Locator}>
    ...
    Dans ton cas, il me semble qu'il faille déclarer le DataContext de chaque page dans son constructeur.

    Voilà
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  5. #5
    Nouveau membre du Club
    Inscrit en
    janvier 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    J'ai un souci avec la liaison de la source et de la vue.
    Dans le constructeur de la page je fais ma liaison
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public DetailPers()
            {
     
                InitializeComponent();
                laPersonne = new Personne();
                LayoutRoot.DataContext = laPersonne;
     
            }
    Ensuite je charge mon instance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      private void TraitementDuXml(string xmlResult)
            {
     
                    laPersonne = new Personne(xmlResult, Personne.TypePersonne.Collaborateur);}
    Dans la classe les propriétés sont chargées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public Personne(string xml, TypePersonne typePersonne)
            {
     
                XElement xResultat = XElement.Parse(xml);
                this.Email = xResultat.Element("Mail").Value;
                this.MobilePhoneNumber = xResultat.Element("NumMobile").Value;
                this.DisplayName = xResultat.Element("NomAffichage").Value;
                this.FamilyName = xResultat.Element("Nom").Value;
                this.GivenName = xResultat.Element("Prenom").Value;
                this.Id = xResultat.Element("Matricule").Value;
                this.FixedLineNumber = xResultat.Element("NumFixe").Value;}
    J'ai implémenté dans cette classe l'event propertychanged:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     public event PropertyChangedEventHandler PropertyChanged;
     
            private void NotifyPropertyChanged(String propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (null != handler)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    Mais le souci est que la vue n'a pas été informé des changements apparemment...Tu vois d'où ça pourrait venir ? Par contre si je refais une liaison après que mon objet ait été chargé alors là ça fonctionne...

    Merci encore

  6. #6
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : août 2003
    Messages : 1 986
    Points : 1 450
    Points
    1 450
    Par défaut
    Oui,

    Le fait d'implanter INotifyPropertyChanged ne suffit pas.

    Il faut que tu utilises dans le setter de chaque propriété de ta classe Model la commande suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
    private string _MaPropriété;
    Public string MaPropriété
    {
      get { return _MaPropriété;}
      set { _MaPropriété = value; NotifyPropertyChanged("MaPropriété");}
    }
    ...
    Si tu ne mets pas ça, il n'y a rien qui indique lors du changement de valeur d'envoyer un message de mise à jour.

    Voilà
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  7. #7
    Nouveau membre du Club
    Inscrit en
    janvier 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    Que fais exactement la methode ci dessous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void NotifyPropertyChanged(String propertyName)
            {
     
                if (PropertyChanged!=null)
                {
     
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    Désolé pour ma noobitude...

    J'ai fait ce que tu m'as dit pour toutes les propriétés mais la vue ne semble toujours pas liée à mon model ou viewmodel (je sais jamais)...

    Je suis toujours obligé de redefinir le datacontext après que mon instance ait été chargée pour que la vue me renvoie les infos...

  8. #8
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : août 2003
    Messages : 1 986
    Points : 1 450
    Points
    1 450
    Par défaut
    La méthode que tu cites est chargé d'envoyer le message comme quoi la valeur d'une propriété a changée.

    Si cela ne fonctionne pas, c'est pourquoi je t'ai recommandé de passé par MVVM Light qui dispose d'un Locator qui permet de binder correctement les données des ViewModels au Views.

    Voilà
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  9. #9
    Nouveau membre du Club
    Inscrit en
    janvier 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    Oui j'avais compris la fonction globale de la fonction mais je voyais pas dans le debug ce qui se passait réellement après que cette ligne soit exécutée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PropertyChanged(this, new PropertyChangedEventArgs(propertyName))
    Pour moi il s'agissait d'une simple levé d'event mais je voualis comprendre ce qui se passait dans le code après cette ligne...

    Oui je vais me pencher sur le modele MVVM et sur le toolkit mais pour l'instant je me contente de coder (un peu comme un malpropre) pour rendre un premier jet de l'application au client.

    En tout cas merci pour ton aide

    A+

  10. #10
    Membre émérite
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : février 2010
    Messages : 1 504
    Points : 2 681
    Points
    2 681
    Par défaut
    Pour faire simple,

    Quand XAML reconnait qu'une classe de type INotifyPropertyChanged est bindé il s'abonne tout seul à l'event NotifyChanged de celle ci.
    En revanche, à c'est toi de lui dire quand l'évenement doit être appelé car ce n'est pas automatisable (certaines fois tu ne veux pas que ton interface graphique se rafraichisse au changement de data + cout de la notfication en terme d'optimisation).
    Pour finir quand tu appelles this.NotifyPropertyChanged("MaPropriété"); la méthode appelle l'event et qui demandera à l'UI de se mettre à jour.
    .
    Pas de question technique en MP, merci.
    .
    Un emulator Gameboy Color pour Windows Phone ?
    c'est moi qui l'ai fait

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

Discussions similaires

  1. [XL-2007] Couper les liaisons entre les sources de données et leurs graphique en VBA
    Par mah.ngaz dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/04/2013, 20h05
  2. l'expert Liaison de données XML
    Par LN(a) dans le forum Delphi
    Réponses: 1
    Dernier message: 01/12/2006, 19h15
  3. Acceder à la donné source : SQL builder
    Par margilb dans le forum C++Builder
    Réponses: 1
    Dernier message: 29/04/2006, 11h46
  4. Où est l'Expert Liaison de données XML [BCB6]
    Par Colloc dans le forum C++Builder
    Réponses: 3
    Dernier message: 21/02/2005, 15h33
  5. Liaison de données - formulaires
    Par Bikey dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 21/10/2004, 16h05

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