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 :

DependencyProperty Binding WPF


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Homme Profil pro
    SUPINFO International University
    Inscrit en
    Novembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SUPINFO International University

    Informations forums :
    Inscription : Novembre 2011
    Messages : 62
    Points : 40
    Points
    40
    Par défaut DependencyProperty Binding WPF
    Bonjour à tous,

    J'ai un soucis avec le DependencyProperty de mon UserControl.

    En effet lorsque je veux Binder une des propriétés, tout simplement rien ne se passe :

    Voici le code complet du UserControl :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    Public Class MateriauItem
        Inherits UserControl
     
     
    #Region "Fields"
     
        Private _IsUsed As Boolean
        Private _Nom As String
        Private _Epaisseur As Integer
     
    #End Region
     
    #Region "Properties"
     
        Public Shared ReadOnly NomProperty As DependencyProperty = DependencyProperty.Register("Nom", GetType(String), GetType(MateriauItem), New PropertyMetadata(Nothing))
     
        Public Property IsUsed As Boolean
            Get
                Return Me._IsUsed
            End Get
     
            Set(ByVal value As Boolean)
                Me._IsUsed = value
                ChkUse.IsChecked = value
            End Set
        End Property
     
        Public Property Nom As String
            Get
                GetValue(NomProperty)
            End Get
     
            Set(ByVal value As String)
                SetValue(NomProperty, value)
                TbName.Text = value
            End Set
        End Property
     
        Public Property Epaisseur As Integer
            Get
                Return Me._Epaisseur
            End Get
     
            Set(ByVal value As Integer)
                Me._Epaisseur = value
                CbxEpaisseur.SelectedItem = value
            End Set
        End Property
     
    #End Region
     
    #Region "Constructor"
     
        Public Sub New()
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
        End Sub
     
    #End Region
     
    End Class

    Voici le code XAML de l'utilisation du UserControl :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                        <ListBox x:Name="LbxMateriaux">
                            <ListBox.ItemTemplate>
                                <DataTemplate DataType="{x:Type local:Materiau}" >
                                    <local:MateriauItem Nom="{Binding Path=Label}" />
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>


    Et enfin le code d'ajout d'un matériau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim mt As Materiau = New Materiau("test1")
    LbxMateriaux.Items.Add(mt)

    L'élément est donc bien ajouté dans la liste mais la valeur "test1" n'est pas affichée.

    Je bloque depuis quelques jours là dessus, je me permets donc de solliciter vos compétences.

    D'avance merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Tu dois faire heriter ta classe MateriauItem de l'interface INotifyPropertyChanged et déclencher lorsque tu met a jour tes données tu dois déclencher l'evenement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Code VB.NET
    PropertyChanged(Me, New PropertyChangedEventArgs("<NomPropriete>"))
    en plus dans ton binding coté XAML, je te conseil de rajouter Mode=TwoWay afin de bénéficier de la bidirection du binding

  3. #3
    Membre du Club
    Homme Profil pro
    SUPINFO International University
    Inscrit en
    Novembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SUPINFO International University

    Informations forums :
    Inscription : Novembre 2011
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    Bonjour Guillaume et tout d'abord merci.

    Toutefois je suis débutant en WPF et je ne parviens pas à mettre en place le code que tu m'as donné. Pourrais tu être plus précis s'il te plait.

    D'avance merci

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    La solution donnée par gcorbineau est erronée étant donné qu'on ne parle pas d'une propriété standard mais d'une Dependency Property. Donc pas besoin de INotifyPropertyChanged

    Je ne connais pas bien VB mais a priori ce n'est pas ta Dependency Property qui est en cause mais plutôt ton XAML

    En effet, dans un DataTemplate ce n'est pas du tout cela qu'il faut mettre.

    ça ressemblerait plutôt à ça:
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ListBox x:Name="LbxMateriaux">
    	<ListBox.ItemTemplate>
    		<DataTemplate DataType="{x:Type local:Materiau}" >
    			<TextBlock Text="{Binding Nom}" />
    		</DataTemplate>
    	</ListBox.ItemTemplate>
    </ListBox>

    En sachant que si ton objectif n'est que d'afficher le nom de ton Materiau, tu peux laisser le Template par défaut et plutôt faire comme ça
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    <ListBox x:Name="LbxMateriaux" DisplayMemberPath="Nom" />

    Voilà, je pense que ça devrait résoudre ton problème

Discussions similaires

  1. Combobox et Binding wpf
    Par Lionhart dans le forum C#
    Réponses: 0
    Dernier message: 06/08/2014, 10h49
  2. [MVVM] Binding WPF pattern MVVM
    Par TarteAuCitron dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 03/03/2013, 17h36
  3. [Débutant] DependencyProperty Binding WPF
    Par Samyy17 dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/02/2013, 09h24
  4. Quel type de collection utilisez-vous pour le binding WPF ?
    Par FRED.G dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 04/07/2008, 20h55
  5. RichTextBox et Binding - WPF
    Par marma dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 16/05/2008, 14h04

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