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 :

UserControl et Binding


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
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut UserControl et Binding
    Bonjour,
    je vais essayer d'exprimer mon problème de la manière la plus claire...
    Soit un UserControl Diary, à l'intérieur duquel est déclarée une classe public Appointment (objets manipulés en interne par le UserControl).
    Cette classe Appointment a une propriété Description de type String et une propriété AppointmentGraph de type AppointmentRectangle.
    Voici donc à quoi ressemble ma class Diary (UserControl) :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public Class Diary
    [...]
        Public Class Appointment
            Public Property Description() As String           
            End Property
     
            Public Property AppointmentGraph() As AppointmentRectangle    
            End Property
        End Class
    End Class
    AppointmentRectangle est un autre UserControl, intégré au UserControl Diary, et est la représentation graphique d'un objet Diary.Appointment
    Le UserControl AppointmentRectangle a une Dependency Property Text.
    Problème : je souhaiterais binder AppointmentRectangle.Text à Diary.Appointment.Description.
    Lors de la création d'un objet Appointment et de son AppointmentRectangle lié, j'ai écrit :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim app as New Appointment
    app.AppointmentGraph = New AppointmentRectangle
    Dim bind As Binding = New Binding()
    bind.Source = app
    bind.Path = New PropertyPath("Description")
    bind.Mode = BindingMode.TwoWay
    app.AppointmentGraph.SetBinding(AppointmentRectangle.TextProperty, bind)
    Mais... ça ne marche pas ! Lorsque je modifie app.Description, la propriété AppointmentRectangle.Text n'est pas modifiée...

    P.S : je précise que la propriété AppointmentRectangle.Text est déjà bindée, en interne au niveau du UserControl AppointmentRectangle à la propriété Text du Textbox qui constitue,entre autre, ce UserControl.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut
    En me relisant, et en le voyant écrit, je pense que le problème vient justement du fait que AppointmentRectangle.Text est bindée 2 fois :
    • une fois en interne au niveau du UserControl AppointmentRectangle lui-même
    • une fois lorsque j'essaie de re-binder à la propriété Diary.Appointment.Description

    Je pense qu'il faudrait que j'utilise le multi binding.
    Voici ce que j'ai écrit :
    Code vb : 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
    Dim app As New Appointment
    Dim appGraph As New AppointmentRectangle
    
    Dim multibind As New MultiBinding
    'Je récupère le binding actuel défini sur AppointmentRectangle.TextProperty :
    Dim bindAppRect As BindingExpression = appGraph.GetBindingExpression(AppointmentRectangle.TextProperty)
    Dim bind As Binding = New Binding()
    bind.Source = app
    bind.Path = New PropertyPath("Description")
    bind.Mode = BindingMode.TwoWay
    bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
    multibind.Bindings.Add(bindAppRect.ParentBinding)
    multibind.Bindings.Add(bind)
    BindingOperations.ClearBinding(appGraph, AppointmentRectangle.TextProperty)
    appGraph.SetBinding(AppointmentRectangle.TextProperty, multibind)
    app.AppointmentGraph = appGraph
    Mais là, il me met une erreur sur la ligne en rouge :
    La référence d'objet n'est pas définie à une instance d'un objet.
    bindAppRect vaut Nothing...
    Comment faire ?

  3. #3
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Ce doit etre que cette ligne ne renvoie rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim bindAppRect As BindingExpression = appGraph.GetBindingExpression(AppointmentRectangle.TextProperty)
    Peut-etre que l'objet n'est pas encore bien initialisé => le binding n'est pas encore mis.
    Le XAML, il ressemble à quoi?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut
    Voici le Xaml du UserControl AppointmentRectangle (j'ai enlevé tous les styles pour alléger):
    Code xaml : 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
    <UserControl x:Name="userControl" x:Class="AppointmentRectangle"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"  
                 mc:Ignorable="d" 
                 d:DesignHeight="182" d:DesignWidth="494" Width="Auto">
     
        <Grid>
        	<Rectangle x:Name="rectangle" Style="{DynamicResource Appointment}">
        	</Rectangle>
            <Border x:Name="border" Style="{DynamicResource BorderStyle}"/>
            <TextBox x:Name="textBox" Style="{DynamicResource TextBoxStyle1}" FocusVisualStyle="{DynamicResource TBFocusStyle}" Text="{Binding Text, ElementName=userControl, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />  
        </Grid>
    </UserControl>
    Citation Envoyé par GuruuMeditation Voir le message
    Ce doit etre que cette ligne ne renvoie rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim bindAppRect As BindingExpression = appGraph.GetBindingExpression(AppointmentRectangle.TextProperty)
    Effectivement, cette ligne ne renvoie rien, j'ai vérifié. Mais pourquoi ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut
    Voici, illustré par un schéma (peut-être plus clair) ce que j'aimerais faire :

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut
    Voici le premier code que j'avais écrit.
    Lors de la création d'un nouvel objet Appointment :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim app As New Appointment
    Dim appGraph As New AppointmentRectangle
    app.AppointmentGraph = appGraph
    app.Description = "Nouveau rendez-vous"
    Avec dans la méthode Set de la propriété Description :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Class Appointment
    Public Property Description() As String
        Get
            Return _Description
        End Get
        Set(ByVal value As String)
            _Description = value
            Me.AppointmentGraph.Text = value
        End Set
    End Property
    End Class
    Avec ceci, lorsque je modifie Diary.Appointment.Description, le UserControl AppointmentGraph lié se met à jour (vu que sa Dependency Property Text est bindée à son textbox constitutif).
    Maintenant, étant donné que au niveau du UC AppointmentRectangle, je peux taper du texte dans le textbox => la propriété AppointmentRectangle.Text change et j'aimerais récupérer ce changement dans Diary.Apppointment.Description.
    C'est maintenant que je me dis : pourquoi ne pas tout simplement changer la méthode Get de la propriété Description en :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Property Description() As String
        Get
            Return Me.AppointmentGraph.Text
        End Get
    [...]
    End Property
    A ce moment-là, la variable privée _Description ne me sert plus à rien, et plus question de multi binding, bien sûr.
    Cette façon de faire est-elle la bonne ?

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

Discussions similaires

  1. [MVVM] Usercontrol RelayCommand Binding
    Par quentin869 dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 16/04/2013, 21h07
  2. [WPF] Probléme de binding dans un UserControl :(
    Par UNi[FR] dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 17/07/2008, 15h51
  3. UserControl + Binding
    Par Dihel dans le forum Windows Forms
    Réponses: 5
    Dernier message: 11/04/2008, 10h13
  4. Binding entre deux UserControl
    Par mehdi_ouni dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 11/03/2008, 16h10
  5. [WPF] UserControl -> binding ??
    Par UNi[FR] dans le forum C#
    Réponses: 1
    Dernier message: 10/09/2007, 11h31

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