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 :

Binder une propriété d'un UserControle à partir d'un autre UserControl


Sujet :

Windows Phone .NET

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut Binder une propriété d'un UserControle à partir d'un autre UserControl
    Bonjour,

    Je ne sais pas si je suis très claire dans mon titre mais ce que je voudrais réaliser c'est binder la valeur du usercontrol mais à partir d'un autre fichier xaml comme window.xaml, ou un autre usercontrol. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <Views:Identify x:Name="identify" Grid.Row="1"/>
    C'est le usercontrol que j'ai créer dans mon windows.xaml. Mon usercontrol ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <TextBox Name="user"></TextBox>
        <TextBox Grid.Row="1"></TextBox>
        <Button Grid.Row="2">Connection</Button>
    </Grid>
    Et je voudrais Binder la propriété "text" de la variable "user" à la propriété qui se trouve dans le datacontext de Window.xaml. Je veux faire ce binding:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <TextBox Name="user" Text="{Binding client_.clientInfo_.name_, Mode=TwoWay}"></TextBox>
    mais à partir de windows.xaml. Est-ce possible ? je veux le faire dans le fichier xaml. Je pense que l'on peut faire quelque chose comme ça, mais dans le code behind du usercontrol:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public TextBox user_
        {
            get
            {
                return user;
            }
            set
            {
                user = value;
            }
        }
    Mais je préférerais ne pas toucher au code behind. Je ne veux pas casser mon model MVVM. Pour moi ça ne le casse pas, mais je débute, donc je maîtrise pas trop encore lol. Il y a peut être des éléments que je ne prends pas en compte.

    Merci.

  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 : 51
    Localisation : France

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

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

    si j'ai bien compris ...

    tu as deux ViewModel pour deux View qui chacune utilise un UserControl.

    Si c'est ça il te faut utilise le conteneur IOC de MVVM Light (Si c'est ce toolkit que tu utilise) pour récupérer la propriété de tonViewModel A depuis ton ViewModel B.

    De mémoire c'est un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     GalaSoft.MvvmLight.ViewModelA.Toto
    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
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    Désolé je me suis sans doute mal exprimé. Il n'y a rien (je pense) de très sophistiqué. Je veux simplement accéder à la propriété de mon usercontrole à partir d'un autre Usercontrole par exemple, ou n'importe qu'elle autre fichier xaml qui contiendrait mon usercontrole.
    Par exemple mon usercontrol a un Textbox qui se nomme "user". Je déclare ce usercontrol dans un autre usercontrol (je ne sais pas si c'est possible, je débute). Je voudrais binder la propriété "text" de mon TextBox "user" depuis mon autre usercontrol.

  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 : 51
    Localisation : France

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

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    C'est bien ce que je dis ...

    Xaml A (UserControl A) -> ViewModel A
    Xaml B (UserControl B) -> ViewModel B

    Dans chaque ViewModel tu as une propriété Toto qui est bindé sur la propriété Text de tes USerControl.

    En utilisant le code que j'ai donné tu dois pouvoir accéder à la propriété Toto du ViewModel A depuis le ViewModel B (Le tout sans passer par les Xaml).

    A tester
    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
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    Mea culpa lol. Mais je voudrais justement le faire via le xaml directement. En exposant les propriétés dans le code behind, comme dans mon exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public TextBox user_
        {
            get
            {
                return user;
            }
            set
            {
                user = value;
            }
        }
    cela ne fonctionnerais pas ?
    Je fais peut etre fausse route depuis le debut. Je cherche un moyen simple de binder les proprietes de mes usercontrols. Chercher à binder les proprietes comme je le désire est-il etrange ? Comment procedez vous quand vous voulez binder une propriete de votre usercontrol ? Peut etre que mon architecture n'est pas bonne et que je devrais avoir un ViewModel egalement pour mes Views.
    Merci pour vos reponses.

  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 : 51
    Localisation : France

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

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    A mon avis cela ne peut pas fonctionner car tu ne peux pas appeler un contrôle d'une page XAML depuis une autre page XAML.

    Peut être quelqu'un infirmera ce que je dis mais il me semble que cela n'est pas possible et c'est pourquoi on utilise MVVM.
    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
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    Mais lorsque vous créer un usercontrol, comment faite vous pour binder un des controles de ce usercontrol ?
    Dans mon exemple j'ai mon Windows.xaml qui contient un usercontrol. Ce usercontrol possède deux textbox. Comment puis-je les binder au datacontext définit dans mon Windows.xaml ?

  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 : 51
    Localisation : France

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

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    Normalement ton UserControl doit exposer ses propriétés !

    Si tu fais MonUserControl.MaTextBox1.Text ça ne fonctionne pas ?
    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
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    Si j'essaye de faire dans mon Windows.xaml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <Views:Identify Name="identify" Grid.Row="1" user_.Text="toto"/>
    Dans mon UserControl Identity:

    code behind:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public TextBox user_
            {
                get
                {
                    return user;
                }
                set
                {
                    user = value;
                }
            }
    et xaml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <TextBox Name="user" ></TextBox>
    Cela ne marche pas. user_.Text="toto" n'est pas détecter. Peut etre devrais-je exposer TextBox.Text au lieu de simplement TextBox.

    Mais oui je peux faire identify.user.Text = "toto"; mais dans le Windows.cs et je voudrais le faire dans le .xaml. Cela ne me rerangerais pas de le faire dans le code behind, le seul problème c'est que je voudrais set le dataContext de mon Windows.xaml. Donc si je fait identify.user.Text = "toto"; dans mon ViewModel, il ne va pas savoir ce que c'est (je pense).
    Par ce que ma page Windows.xaml fera office de View.

    Je ne sais pas si je suis très claire désolé. Mon application aura plusieurs pages. Par exemple une page Inscription, une page Login, une page Profil(qui sera un pivot). Et chacune de mes pages aura son propre dataContext. Mais à l'intérieur de mes pages il y aura plusieurs Usercontrols.

    Donc la page(View) Login.xaml aura pour ViewModel Login.cs, et ça sera la même chose pour mes pages inscriptions et profil.

    Donc j'ai créé mes usercontrols, maintenant j'essaie de les mettre dans ma View Login.xaml et de binder les controles de mes Usercontrols aux propriétés de mon Datacontext (Login.cs).

    Lorsque j'expose la propriété TextBox.Text et que j'essaye de faire TextBox.text="toto" dans mon Login.xaml ça me dit que le membre user n'est pas reconnu ou n'est pas accessible. (Maj: J'ai régénéré le projet et maintenant ça "marche")

    EDIT: Je viens de changer ma page de démarage dans le manifest. J'ai fais TextBox.text="toto" et ça marche pas de souci, ensuite j'ai fais TextBox.text="{Binding label}", label étant une propriété que j'ai déclarée dans mon ViewModel et je me retrouve avec une exception:
    Informations supplémentaires : Failed to assign to property 'Sportmates.Views.Login.Identify.User'. [Line: 29 Position: 30]
    J'aurais un problème avec les dependency properties mais je ne sais pas ce que s'est.

    Cette exception est levée dans le code behind de ma page, CAD Login.xaml.cs

    PS: Quand je parle de Login.cs, je ne parle pas du code behind de Login.xaml mais bien d'une classe totalement differente.

    Merci.

  10. #10
    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 : 51
    Localisation : France

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

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    Alors le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... TextBox.text="{Binding label}" ...
    n'est pas correcte si celui-ci se trouve dans le XAML, tu dois utiliser ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox Text="{Binding label}"/>
    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

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    Alors le code
    ... TextBox.text="{Binding label}" ...
    n'est pas correcte si celui-ci se trouve dans le XAML, tu dois utiliser ce code:

    <TextBox Text="{Binding label}"/>
    Ce que je voulais dire c'est <my:MonUsercontrol MonTextbox.Text="{Binding label}"/>
    Je créer un usercontrol et j'accède au TextBox à l'intérieur de ce Usercontrol, pour le binder.

  12. #12
    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 : 51
    Localisation : France

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

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    ah ok ...

    alors là je vois pas !!!

    Désolé
    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

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    Ok, merci pour votre temps. Je vais trouver une solution et je la posterai ici. Je voudrais juste savoir si la conception de mon app vous semble correcte, au niveau des pages, de créer des usercontrols à l'intérieur de ces pages, et de binder les propriétés des controls a l'intérieur de mes usercontrols. Si tout ça est une bonne idée ou si il y a mieux à faire.
    Pour savoir si je dois complétement changer ma conception, ou si je peux continuer ainsi.

    Voici ma conception cité plus haut:

    Je ne sais pas si je suis très claire désolé. Mon application aura plusieurs pages. Par exemple une page Inscription, une page Login, une page Profil(qui sera un pivot). Et chacune de mes pages aura son propre dataContext. Mais à l'intérieur de mes pages il y aura plusieurs Usercontrols.

    Donc la page(View) Login.xaml aura pour ViewModel Login.cs, et ça sera la même chose pour mes pages inscriptions et profil.
    Merci.

  14. #14
    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 : 51
    Localisation : France

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

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    Je n'ai jamais eu le besoin de créer mes propres contrôles mais si tel est le cas pour toi, tu es dans la bonne voie.

    Il suffit juste de trouver comment exposer les propriétés des différents composants constituants ton UserControl et le tour est joué
    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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/01/2015, 19h29
  2. Réponses: 8
    Dernier message: 12/09/2013, 13h25
  3. [Débutant] changer une propriété d'un ViewModel à partir d'un autre
    Par ragu23 dans le forum Silverlight
    Réponses: 2
    Dernier message: 19/06/2012, 16h32
  4. Binder une propriété en dehors d'un DataTemplate
    Par DotNET74 dans le forum Windows Phone
    Réponses: 9
    Dernier message: 26/04/2011, 15h44
  5. Réponses: 6
    Dernier message: 12/02/2008, 14h56

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