none
Binding "bidirectionnel" RRS feed

  • Question

  • Bonjour,

    J'utilise le databinding pour lier les contrôles d'un formulaire à un objet personnalisé à l'aide du code ci dessous :

    Code Snippet

    monControle.DataBindings.Add("Value", monObjet.Item(0), "Quantite", True, DataSourceUpdateMode.OnPropertyChanged)


    Si l'utilisateur modifie la valeur de "monControle" : aucun problème, la propriété "monObjet.Item(0).Quantite" de mon objet est à jour.

    Par contre si je modifie directement la propriété "monObjet.Item(0).Quantite" de mon objet : les changements ne sont pas reflétés dans le contrôle "monControle".

    J'imagine que le binding doit pouvoir fonctionner dans les 2 sens : du contrôle vers l'objet, et de l'objet vers le contrôle. Mais comment faire ? Est-ce qu'il faut que j'ajoute un événement au niveau de mon objet ?

    Merci pour votre aide !

    Cordialement,
    Pascal





    mardi 29 janvier 2008 10:51

Réponses

  • Bonjour,

    Pour que le binding marche dans le sens Objet -> Contrôle, il faut que votre objet implémente l'interface System.Component.INotifyPropertyChanged.

     

    Voila un exemple de classe implémentant cette interface :

     

    Code Snippet

    Imports System.ComponentModel

     

    Public Class MaClasse

    Implements INotifyPropertyChanged

     

    Private m_txt As String

    Private m_qty As Integer

     

    Public Property Text() As String

    Get

    Return Me.m_txt

    End Get

    Set(ByVal value As String)

    If (Me.m_txt <> value) Then

    Me.m_txt = value

    Me.OnPropertyChanged(New PropertyChangedEventArgs("Text"))

    End If

    End Set

    End Property

     

    Public Property Quantity() As Integer

    Get

    Return Me.m_qty

    End Get

    Set(ByVal value As Integer)

    If (Me.m_qty <> value) Then

    Me.m_qty = value

    Me.OnPropertyChanged(New PropertyChangedEventArgs("Quantity"))

    End If

    End Set

    End Property

     

    Protected Overridable Sub OnPropertyChanged(ByVal e As PropertyChangedEventArgs)

     

    RaiseEvent PropertyChanged(Me, e)

     

    End Sub

     

    Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged

     

    End Class

     

     

    Guillaume
    mardi 29 janvier 2008 11:29

Toutes les réponses

  • Bonjour,

    Pour que le binding marche dans le sens Objet -> Contrôle, il faut que votre objet implémente l'interface System.Component.INotifyPropertyChanged.

     

    Voila un exemple de classe implémentant cette interface :

     

    Code Snippet

    Imports System.ComponentModel

     

    Public Class MaClasse

    Implements INotifyPropertyChanged

     

    Private m_txt As String

    Private m_qty As Integer

     

    Public Property Text() As String

    Get

    Return Me.m_txt

    End Get

    Set(ByVal value As String)

    If (Me.m_txt <> value) Then

    Me.m_txt = value

    Me.OnPropertyChanged(New PropertyChangedEventArgs("Text"))

    End If

    End Set

    End Property

     

    Public Property Quantity() As Integer

    Get

    Return Me.m_qty

    End Get

    Set(ByVal value As Integer)

    If (Me.m_qty <> value) Then

    Me.m_qty = value

    Me.OnPropertyChanged(New PropertyChangedEventArgs("Quantity"))

    End If

    End Set

    End Property

     

    Protected Overridable Sub OnPropertyChanged(ByVal e As PropertyChangedEventArgs)

     

    RaiseEvent PropertyChanged(Me, e)

     

    End Sub

     

    Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged

     

    End Class

     

     

    Guillaume
    mardi 29 janvier 2008 11:29
  • Formidable ! Merci beaucoup, c'est exactement l'info que je ne parvenais pas à trouver dans la doc...
    mardi 29 janvier 2008 14:29