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

Silverlight Discussion :

Passer une variable "globale" en XAML


Sujet :

Silverlight

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut Passer une variable "globale" en XAML
    Bonjour,

    Pourriez-vous m'aider à résoudre ce problème avant la fin de l'année ?

    Voici le challenge: lorsque j'ouvre une page, je dispose de l'identifiant de l'utilisateur qui est actuellement logué. Par exemple 55. Cette variable est accessible en code behind et pour l'instant, pour pouvoir en disposer dans mon XAML, je suis obligé de me créé un textBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox x:Name="filtreUser" IsReadOnly="True"  Canvas.ZIndex="-1" />
    et sur l'événement "onNavigateTo" de ma page, je vais mettre 55 dans mon textBox

    Dans mon XAML, je peux dès lors écrire un paramètre de mon RIA de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     <riaControls:DomainDataSource.QueryParameters>
                   <riadata:ControlParameter ParameterName="parUserId" ControlName="filtreUser" PropertyName="Text" RefreshEventName="TextChanged" />
                </riaControls:DomainDataSource.QueryParameters>
    Je voudrais bien écrire mon paramètre de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <riadata:ControlParameter ParameterName="parUserId" Value= "{Binding ...}" />
     
     
    mais comment binder vers une variable ??
    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Peut-être en rajoutant ta variable en resources de App.
    Ensuite tu bind en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {Binding Source={StaticResource lenomquetuasmis}}

  3. #3
    Membre confirmé
    Homme Profil pro
    dev
    Inscrit en
    Mai 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : dev
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 73
    Par défaut
    Bonjour

    Apparament tu utilise RIA donc si tu utilise l'autentification du RIA (compatible ASPNET) tu dispose dans ton code Silverlight des infos du User

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Merci pour vos réponses.

    Je dispose effectivement de mes infos users. Mon souci est de rendre cette info accessible dans mon code XAML.

    Dans mon App.xaml j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="Assets/Styles.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    Comment rajouter une Variable "MonUserId"?

  5. #5
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Je t'ai donné la solution à toi de faire un peu de recherche quand même...

    App.Resources.Add

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    J'ai ajouté dans App.xaml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Resources.Add("myResource", clsGlobal.test99)
    test99 est un objet qui contient un integer qui est défini comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Class clsGlobal
            Public Shared test99 As Integer = 99
            End Class
    Je peux en effet accéder dans mon XAML en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {Binding Source={StaticResource myResource}}
    mais le problème est que ce n'est pas une variable, mais bien une constante.

    Je peux aussi, dans maPage.xaml.vb faire un Me.resources.add("var2", clsGlobal.test99), avec l'avantage qu'à ce moment je peux mettre ce que je veux dans test99 (c'est donc une variable) mais comment y accéder de mon XAML?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {Binding Source={ResourceDictionary  BkeResource}}
    ne fonctionne pas

  7. #7
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Garde la même syntaxe pour le Binding avec StaticResource.

    Le App.Resources.Add tu peux le mettre où tu veux (dans la MainPage.xaml.vb par exemple).

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    en dehors de App, écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    App.Resources.Add("myResource", clsGlobal.test99)
    ne compile pas avec une erreur
    Reference to a non-shared member requires an object reference
    Je peux bien faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    App.Current.Resources.Add("myResource", clsGlobal.test99)
    mais alors, le
    StaticResource
    ne le reconnait pas

  9. #9
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Essaye dans App.xaml.cs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Resources.Add("xxx", new clsGlobal());
    Ensuite dès que tu veux changer la valeur de la variable test99

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((clsGlobal)App.Resources["xxx"]).test99 = 42;
    Tu peux aussi faire implémenter INotifyPropertyChanged à ta classe.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    est-ce que tu aurais une petite idée de la traduction de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((clsGlobal)App.Resources["xxx"]).test99 = 42;
    en vb car les convertisseurs ne fonctionnent pas

  11. #11
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    En VB je ne sais mais en language humain ça veut dire:

    Je prend la ressources ayant la clef "xxx" que je caste en clsGlobal. Puis j'assigne la valeur 42 à la propriété "test99" de cette ressource.
    Le tout en une ligne
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Je l'avais plus ou moins traduit comme çà...

    ce qui devrais me donner en vb

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CType(App.Resources("xxx"), clsGlobal).test99 = 42
    Malheureusement, le App.resources n'est pas accessible (il apparait en souligné). et l'erreur est toujours :
    Reference to a non-shared member requires an object reference
    Est-ce que je dois rajouter qqchose à ma classe App ?

  13. #13
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Tu avais corrigé par toi-même 2 posts plus haut.

    App.Current.Resources.

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    et bien non, l'ajout de current entraine le message suivant

    Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.

  15. #15
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Montre ta ligne de code.

    Cette ligne fonctionne parfaitement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    App.Current.Resources["test"]

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Récapitulons,

    Je peux faire dans MaPage.xaml.vb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    clsGlobal.test99 = 333
    App.Current.Resources.Add("toto", clsGlobal.test99)
    Ce qui serait le plus logique, mais malheureusement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox Text="{Binding Source={StaticResource toto}}" />
    Ne retourne rien. Le Current semble donc incompatible avec le StaticResources.

    Je peux aussi faire dans ma page App.xaml.vb:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Resources.Add("toto", clsGlobal.test99)
    Avec un test99 qui a été initialement mis à 444,
    cela me retourne bien 444 dans mon textBox, mais le problème c’est que c’est une constante.

    Ensuite pour pouvoir gérer ma ressource en tant que variable, je mets dans App.xaml.vb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Resources.Add("xxx", New clsGlobal())
    Dans ce cas, les tentatives avec current me donnent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    App.Current.Resources("xxx")
    Property access must assign to the property or use its value.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    App.Current.Resources("xxx") =42
    Compile mais quand je veux afficher ma page, il m’indique /maPage not found

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CType(App.Current.Resources("xxx"), clsGlobal).test99 = 42
    Warning 1 Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.
    Et enfin,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CType(App.Resources("xxx"), clsGlobal).test99 = 42
    App.resources non reconnu avec le message
    Error 1 Reference to a non-shared member requires an object reference.

  17. #17
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Hum.

    Montre la définition de clsGlobal.

    J'étais parti de la suppostion que test99 était une propriété mais ça n'a pas l'air d'être le cas.

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Voici voilà...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Class clsGlobal
        Public Shared baseUri As Uri = Nothing
        Public Shared IdUtilisateur As Integer = -1
        Public Shared IdRevendeur As Integer = -1
        Public Shared IdCountryRevendeur As Integer = -1
        Public Shared IdAsp As Guid = Nothing
        Public Shared test99 As Integer = 99
     
    End Class
    Maintenant s'il faut créé une propriété, pourquoi pas.

  19. #19
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Enlève les Shared (ça doit vouloir dire static) et remplace les par des propriétés.

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    On ne doit plus être très loin d'une solution ...

    dans App.xaml.vb j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Resources.Add("xxx", New clsGlobal())
    Dans clsGlobal.vb j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Class clsGlobal
     
        Private _test99 As Integer = 333
        Public Property test99() As Integer
            Get
                Return _test99
            End Get
            Set(ByVal value As Integer)
                _test99 = value
            End Set
        End Property
    Dans maPage.xaml.vb j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CType(App.Current.Resources("xxx"), clsGlobal).test99 = 777
    et dans maPage.xaml j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                        <TextBox x:Name="test"  Text="{Binding Source={StaticResource xxx}}"  />
    et là il m'affiche dans mon textBox "Test" :
    "myAppli.clsGlobal"
    Si je mets ={StaticResource xxx.test99}, il ne m'affiche plus rien

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. passer une variable globale
    Par sub-0 dans le forum Langage
    Réponses: 5
    Dernier message: 04/05/2010, 17h24
  2. Réponses: 1
    Dernier message: 17/07/2008, 16h41
  3. [Struts] Passer une variable dans l'url
    Par pilz dans le forum Struts 1
    Réponses: 2
    Dernier message: 30/03/2005, 15h23

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