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 :

binding d'une classe "global"


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 binding d'une classe "global"
    Bonsoir,

    J'essaie de faire un binding à partir d'une classe "global" de JUserNom:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Imports JBase.Web
    Imports System.Globalization
    Imports System
    Imports System.Windows.Controls
     
    Public Class clsGlobal
        Implements System.ComponentModel.INotifyPropertyChanged
     
            Public Shared JUserNom As String = ""
     
         Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    End Class

    Dans LoginStatus.xaml.vb,

    j'ai mis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Public Sub New()
            Me.InitializeComponent()
            Me.UpdateLoginState()
     
            Me.welcomeText.SetBinding(TextBlock.TextProperty, CreateOneWayBinding(clsGlobal.JUserNom))
        End Sub
    Qui ne fonctionne pas...

    Comment dois-je faire mon binding sur clsGlobal.JUserNom ?

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Citation Envoyé par Golzinne Voir le message
    Qui ne fonctionne pas...
    C'est-à-dire ? Comment tu peux affirmer que cela ne marche pas ? Avec le code que tu nous montre, rien ne nous permet de vérifier...

    Sinon, il me semble que pour que le binding fonctionne, il faut se lier obligatoirement à une propriété (get/set) et non pas à un champ

  3. #3
    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
    Quelle confiance ...

    Non sans rire, le code tel que l'ai écrit ne compile tout simplement pas.

    Le message d'erreur est :
    Argument not specified for parameter 'propertyPath' of 'Public Function CreateOneWayBinding(bindingSource As System.ComponentModel.INotifyPropertyChanged, propertyPath As String, [converter As System.Windows.Data.IValueConverter = Nothing]) As System.Windows.Data.Binding'
    En fait, dans LoginStatus.xaml.vb, j'essaie de changer le nom de login ASP défini par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.welcomeText.SetBinding(TextBlock.TextProperty, WebContext.Current.CreateOneWayBinding("User.DisplayName", New StringFormatValueConverter(ApplicationStrings.WelcomeMessage)))
    par un nom que je défini ailleurs.

    Pour tenir compte de ta remarque, j'ai changé ma clsGlobal par:
    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
    Public Class clsGlobal
        Implements System.ComponentModel.INotifyPropertyChanged
        Private Shared m_JUserNom As String = ""
     
        Public Shared Property JUserNom() As String
            Get
                Return m_JUserNom
            End Get
            Set(ByVal value As String)
                m_JUserNom = value
                'Désactivation du RaiseEvent qui génère une erreur dans une Shared Property 
                'RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("JUserNom"))
            End Set
        End Property
     
     
     
     
        Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    End Class
    Il faut noter que le code original fait appel à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WebContext.Current.CreateOneWayBinding
    Comme mon JUserNom ne fait pas partie du WebContext, je suppose que je dois plutôt faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataContext.CreateOneWayBinding
    Si j'essaie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Me.welcomeText.SetBinding(TextBlock.TextProperty, DataContext.CreateOneWayBinding(clsGlobal, "JUserNom"))
    mais je reçois le message suivant:
    'clsGlobal' is a type and cannot be used as an expression.

  4. #4
    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
    C'est vraiment illisible le VB.NET...

    De ce que j'ai vu tu essayes de te binder à un truc static, ce qui n'est pas supporté par Silverlight.

    Essaye avec ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .SetBinding(TextBlock.TextProperty, new Binding() { Source = clsGlobal.JUserNom });

  5. #5
    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
    Citation Envoyé par Skyounet Voir le message
    C'est vraiment illisible le VB.NET...

    De ce que j'ai vu tu essayes de te binder à un truc static, ce qui n'est pas supporté par Silverlight.
    Pas supporté, c'est un peu dur...

    J'essaie de contourner le problème en passant par un singleton:

    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
    Public Class myString
        Implements System.ComponentModel.INotifyPropertyChanged
     
        Private _nom As String
        Public Property prtyNom As String
            Get
                Return _nom
            End Get
            Set(ByVal value As String)
                _nom = value
                RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("prtyNom"))
            End Set
        End Property
        Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
     
    End Class
     
     
     
    Public Class mySingleton
        Inherits myString
     
     
        Private Shared _Instance As mySingleton
     
        Private Sub New()
        End Sub
     
        Public Shared ReadOnly Property Instance As mySingleton
            Get
                If (_Instance) Is Nothing Then
                    _Instance = New mySingleton
                End If
                Return _Instance
            End Get
        End Property
     
    End Class
    Dans ma mainpage, j'ai :

    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
    Imports System.Windows.Data
     
    Partial Public Class MainPage
        Inherits UserControl
     
        Public Sub New()
            InitializeComponent()
     
            mySingleton.Instance.prtyNom = "azerty"
     
            Dim bin As New Binding() With {.Source = mySingleton.Instance.prtyNom}
            Me.myText.SetBinding(TextBlock.TextProperty, bin)
     
     
        End Sub
     
        Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles button1.Click
            mySingleton.Instance.prtyNom = "toto"
     
        End Sub
    End Class
    Donc, la bonne nouvelle, c'est que le binding fonctionne puisque dans un premier temps, je vois bien le mot "Azerty" dans mon textBox.

    Par contre, quand je pousse sur le button1, je m'attendrais à ce que mon textbox passe de "azerty" à "toto", mais rien n'y fait.

  6. #6
    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
    C'est normal que ça le fasse pas.

    Essaye avec ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .SetBinding(TextBlock.TextProperty, new Binding("prtyNom") { Source = mySingleton.Instance });

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

Discussions similaires

  1. [WPF] Problème de binding avec une classe perso
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 12/04/2010, 18h45
  2. Probleme de binding pour une classe herité de ModelVisual3D
    Par goast dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 12/08/2009, 16h10

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