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 :

déclarer en xaml un instance de classe avec paramètre


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 352
    Par défaut déclarer en xaml un instance de classe avec paramètre
    bonjour,
    voici mon problème
    j'ai une classe de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Person
            {
                private string _nom;
                public string Nom { get; set; }
     
                public Person(string valeur)
                {
     
                    _nom = valeur;
                }
    que je veux instancier dans le code Xaml en lui passant comme paramètre un nom puis utiliser cet objet comme source de binding

    Comment dois je pratiquer ?

    Par avance merci

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Tu peux le faire comme avec n'importe quelle autre classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <local:Person Nom="name" />
    Si ton scénario est plus complexe et nécessite de data-binder la propriété "Nom" alors il faudrait en faire une propriété de dépendance.

    Cependant il est très rare d'avoir à utiliser des entités métier dans du Xaml, on les place plutôt dans le ViewModel et on les référence depuis le Xaml.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    Dès que tu déclare quelque chose en XAML il va essayer de l'instancier, là le problème... c'est que tu lui fourni un objet avec un constructeur non vide qui attend un paramètre...
    Il instancie l'objet avant de définir les propriétés, donc là ca ne fonctionnera pas.

    Ensuite excuse moi du peu, mais là j'ai du mal à voir l'intérêt de passer par une classe comme source pour le databinding, si tu l'initialise en fournissant toi même le nom... autant fournir le nom direct à tes composants dans le XAML ca ira plus vite que d'utiliser le databinding. (sinon c'est que ton objet connait sa persistance, mais dans ce cas tu viole la séparation des couches, et donc cette façon de programmer devient obsolète...)
    Enfin bon jdit ça jdit rien...

    En plus au lieu de répondre, il eu été plus généreux de lui corriger son code de Person qui est pas mal dans le genre ... j'utilise des belles constructions syntaxiques, sans même savoir ce qu'elles font...
    c'est parce qu'on est sur un forum sur le XAML qu'il faut laisser écrire n'importe quoi dans les autres langages, surtout des trucs incorrects.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class Person
    {
        public string Nom { get; set; }
    }
    Voilà si tu écrit ta classe comme ca... ca marchera sinon non... ton écriture fournie une valeur à _nom par le constructeur, mais comme la propriété Nom est rigoureusement INDEPENDANTE de _nom... ca ne sert à rien...
    l'écriture que tu as utilisée est un raccourci d'écriture spécifique à C# qui n'existe pas en VB.NET. utiliser les raccourci nécessite quand même d'en regarder la doc...

    public string Nom { get; set; }
    une fois converti en ressemble à ce genre de truc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private string _Nom_01;
    public string Nom { get { return _Nom_01; } set { _Nom_01 = value; } }
    en fait le compilateur génère automatiquement un membre privé à ta place...

    ton constructeur serait plus juste avec cette écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public Person(string nom) { Nom = nom; }
    si tu tiens absolument à initialiser le nom dans le constructeur.
    tu veux faire quoi ? respecter le design pattern MVVM ?

    en plus seriousme... c'est également incomplet ce que tu lui a fourni...
    tu as oublié de préciser que local devait être un namespace qui pointe sur l'assembly où est déclaré Person... sinon ca ne fonctionne pas plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <UserControl
    xmlns:local="clr-namespace:monnamespace"
    >
    </UserControl>
    cette forme est valable uniquement si Person est dans la même assembly que le XAML, sinon il faut écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <UserControl
    xmlns:local="clr-namespace:monnamespace;assembly=monassembly"
    >
    </UserControl>

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 352
    Par défaut
    merci à vous deux pour vos réponses
    en effet je suis d'accord sur le faible intérêt du binding dans ce cas. Mais le but que je recherche est de bien maîtriser cette fonction binding et pour ce faire je me crée des cas simples pour représenter les différents cas possibles.

    L'objectif de cet exemple est d'aborder le cas d'un binding sur une instance de class déclaré dans le xaml
    Comme je suis pas un expert comme vous j'aurais besoin de quelles explications concernant ta réponse cinemania lorsque tu indiques
    Citation Envoyé par cinemania Voir le message
    Il instancie l'objet avant de définir les propriétés, donc là ca ne fonctionnera pas.
    cela veut il dire que je ne peux pas en xaml passer un paramètre au constructeur d'une class
    de plus pourquoi redéclarer le namespace via le code xaml . Je pensais à tort que les fichiers XAML et le fichier.cs partageaient le même namespace
    peux-tu me préciser ce point ?

    Par avance merci

  5. #5
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 62
    Par défaut
    Citation Envoyé par TERRIBLE Voir le message
    cela veut il dire que je ne peux pas en xaml passer un paramètre au constructeur d'une class
    Pour pouvoir instancier directement un objet en XAML, il doit avoir un constructeur sans paramètres, et ce ne doit pas être une classe interne.
    Si tu veux instancier des classes avec paramètres, tu peux passer par un ObjectDataProvider.


    Pour ton autre question, tu dois déclarer tous les namespaces que tu utilises dedans, car même si il appartient au même namespace que le code behind, ce namespace n'es pas implicitement déclaré, c'est à toi de le faire.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 352
    Par défaut
    merci spazou
    mais je perds mon latin ou plutôt mon xaml
    en effet suite aux différentes remarques j'ai modifié mon code
    pour la déclaration de la classe j'ai le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            public class Person
            {
                public string Nom { get; set; }
                public Int32 Age { get; set; }
            }
    dans le code xaml j'ai déclaré le namespace de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <Window x:Class="OBJECDATAPROVIDER.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:local="clr-namespace:OBJECDATAPROVIDER" 
    Name="fenetre"
     
            Title="MainWindow" Height="350" Width="525">
    Mais lorsque je désire déclaré en ressource mon instance de la classe Person
    via le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <local:Person Name="Pierre"/>
    local/Person est introuvable

    Pourquoi ? qu'elle est mon erreur
    qu'elle est le sens de xmlns:local ?

  7. #7
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 62
    Par défaut
    Un peu embrouillé tout ça '^^

    Bon, déjà, on va clarifier, tu donnes ta déclaration de ta classe Person, mais dans quel namespace est-elle cette déclaration ?

    Dans ton xaml, tu as écris "Person Name="Pierre"", mais il n'y a pas de propriété "Name", seulement "Nom" :/

    Ensuite "xmlns:local="clr-namespace:OBJECDATAPROVIDER"", cela signifie que dans ton xaml, tu déclares un namespace (xmlns), qui s'appellera "local", et qui correspond au namespace OBJECDATAPROVIDER de ton code présent dans l'assembly où est le xaml, car tu ne précises pas l'assembly.

    ( Pourquoi l'as-tu appelé OBJECDATAPROVIDER d'ailleurs ? )


    Un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace EssaiXAML
    {
        public class Person
        {
            public string Nom {get;set;}
            public Int32 Age {get;set;}
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <Window x:Class="OBJECDATAPROVIDER.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:local="clr-namespace:EssaiXAML" 
    Name="fenetre"
     
            Title="MainWindow" Height="350" Width="525">
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <local:Person Nom="toto" />
    Donc ici, aucun lien avec ObjectDataProvider, veux-tu des précisions là-dessus aussi ?

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

Discussions similaires

  1. Partage d'instance de class avec tous les utilisateurs
    Par topolino dans le forum ASP.NET MVC
    Réponses: 2
    Dernier message: 15/05/2013, 22h25
  2. Constructeur de classe avec paramètres
    Par Invité dans le forum Débuter
    Réponses: 10
    Dernier message: 11/12/2010, 13h19
  3. Généricité en Java (classe avec paramètre)
    Par epcilone059 dans le forum Langage
    Réponses: 1
    Dernier message: 27/03/2009, 12h05
  4. plusieurs instance de classe avec thread
    Par lucky dans le forum MFC
    Réponses: 2
    Dernier message: 14/09/2006, 11h30
  5. Réponses: 6
    Dernier message: 23/02/2006, 20h23

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