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 :

DataBinding sur un objet personalisé


Sujet :

Windows Presentation Foundation

  1. #1
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2012
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 337
    Par défaut DataBinding sur un objet personalisé
    Bonjour,
    Je souhaite réaliser un binding sur une classe personlisée.

    Le contexte :
    A la création d'une fenêtre, je passe en paramètre un DataRow au constructeur.
    Sur le formulaire, j'ai plusieurs TextBox bindées sur les champs du DataRow (ceci fonctionne)
    Là où pour moi ça se complique, c'est que je souhaite reprendre ces informations sur un graphique en prenant en compte les modifications faites dans le TextBox.

    J'ai choisi de passer par une collection dont voici le code :
    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
     
    Public Class ColumnDataPointCollection
        Inherits ObservableCollection(Of ElementDataPoint)
    End Class
     
    Public Class ElementDataPoint
        Inherits DependencyObject
        Implements INotifyPropertyChanged
     
        Public Shared ReadOnly ElementChimiqueProperty As DependencyProperty = DependencyProperty.Register("ElementChimique", GetType(String), GetType(ElementDataPoint), New PropertyMetadata(Nothing))
        Public Shared ReadOnly ValeurProperty As DependencyProperty = DependencyProperty.Register("Valeur", GetType(Double), GetType(ElementDataPoint))
     
        Public Property ElementChimique() As String
            Get
                Return CType(GetValue(ElementChimiqueProperty), String)
            End Get
            Set(value As String)
                SetValue(ElementChimiqueProperty, value)
                NotifyPropertyChanged("ElementChimique")
            End Set
        End Property
     
        Public Property Valeur() As Double
            Get
                Return CType(GetValue(ValeurProperty), Double)
            End Get
            Set(value As Double)
                SetValue(ValeurProperty, value)
                NotifyPropertyChanged("Valeur")
            End Set
        End Property
     
        Public Sub New()
            MyBase.New()
        End Sub
     
        Private Sub NotifyPropertyChanged(ByVal info As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
        End Sub
     
        Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    End Class
    Je n'avais pas, au début, créé les DependencyProperty ce qui rendait impossible le Binding.

    Voici le code XAML du Chart :
    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
     
    <c:Chart Name="ElementsChart" Grid.Row="1" Background="{DynamicResource ResourceKey=GrayLinearGradientBrush}">
    	<c:Chart.Axes>
    		<c:CategoryAxis SortOrder="Ascending" Orientation="X" Location="Bottom" Title="Elements chimiques" ShowGridLines="False" />
    		<c:LinearAxis Title="Teneur en %" Orientation="Y" Location="Left" Minimum="0" />
    	</c:Chart.Axes>
    	<c:Chart.Series>
    		<c:ColumnSeries Name="MétalBaseSerie" Title="{Binding Path=Désignation, Mode=TwoWay}" IndependentValuePath="ElementChimique" DependentValuePath="Valeur" IsSelectionEnabled="True">
    			<c:ColumnSeries.ItemsSource>
    				<l:ColumnDataPointCollection>
    					<l:ElementDataPoint ElementChimique="C" Valeur="{Binding Path=C}"/>
    					<l:ElementDataPoint ElementChimique="Mn" Valeur="{Binding Path=Mn}"/>
    					<l:ElementDataPoint ElementChimique="Cr" Valeur="{Binding Path=Cr}"/>
    					<l:ElementDataPoint ElementChimique="Mo" Valeur="{Binding Path=Mo}"/>
    				</l:ColumnDataPointCollection>
    			</c:ColumnSeries.ItemsSource>
    		</c:ColumnSeries>
    	</c:Chart.Series>
    </c:Chart>
    Si je remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <l:ElementDataPoint ElementChimique="C" Valeur="{Binding Path=C}"/>
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <l:ElementDataPoint ElementChimique="C" Valeur="1"/>
    le graphique est correctement affiché.
    J'en déduit que le binding sur ma propriété "Valeur" n'est pas fait.
    J'avais pensé aussi à binder directement mon DataRow comme étant la source de données du Chart mais le DataRow contient des champs que je ne veux pas mettre sur le chart.

    Ma question est donc la suivante :
    Comment binder certains champs du DataRow à ma ColumnSeries tout en sachant que le graph doit se mettre à jour si je modifie les champs dans les TextBox associées?

  2. #2
    Membre éclairé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2009
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2009
    Messages : 966
    Par défaut
    petite question (qui n'a peut être rien a voir avec la choucroute )

    je ne vois pas dans ton Chart d'ItemSource Binder...

    Ton soucis peut peu être venir de la...

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2012
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 337
    Par défaut
    Bonjour,
    J'ai défini le DataContext de ma fenêtre par code en lui attribuant mon DataRow passé en paramètre au constructeur de la fenêtre. Du coup, à moins que je ne me trompe,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <l:ElementDataPoint ElementChimique="C" Valeur="{Binding Path=C}"/>
    devrait remonter dans l'arborescence et finir par trouver le champ "C" du DataContext de ma fenêtre.
    Ce comportement fonctionne correctement avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox Text="{Binding path=C}"
    En fait, à la base, j'avais attribué un DataContext à mon graph dans le code behind. Le soucis de cette solution, c'est qu'il fallait que je le redéfinisse à chaque fois qu'une valeur changeait dans mes textbox.

    Sur la pièce jointe, on voit que la propriété ItemsSource est bien définie pour le graph mais que les valeurs ne sont pas renseignées alors que mon DataContext est bien défini puisque mes TextBox affichent bien les données.
    Images attachées Images attachées  

  4. #4
    Membre éclairé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2009
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2009
    Messages : 966
    Par défaut
    ok je pense avoir compris ton soucis (enfin j'espère...)


    Dans ton XAML
    Citation Envoyé par Rainui Voir le message
    Si je remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <l:ElementDataPoint ElementChimique="C" Valeur="{Binding Path=C}"/>
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <l:ElementDataPoint ElementChimique="C" Valeur="1"/>
    en faite contrairement a se que tu pense l'élément ne va pas remonter par arborescence.
    Ici il cherche a accéder a une variable C dont il ignore la source.

    je ne connais pas le composant Chart mais a mon avis tu devrais plus avoir un code comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <c:ColumnSeries Name="MétalBaseSerie" ItemSource="{Binding Path=TaCollection}" Title="{Binding Path=Désignation, Mode=TwoWay}"  IndependentValuePath="ElementChimique" DependentValuePath="Valeur" IsSelectionEnabled="True">
    			<c:ColumnSeries.ColumnDataPointCollectionTemplate>
    				<DATATEMPLATE>
    					<l:ElementDataPoint ElementChimique="{Binding ElementChimique}" Valeur="{Binding Valeur}"/>
    				</DATATEMPLATE>
    			</c:ColumnSeries.ColumnDataPointCollectionTemplate>
    </c:ColumnSeries>

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2012
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 337
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <c:ColumnSeries Name="MétalBaseSerie" ItemSource="{Binding Path=TaCollection}" Title="{Binding Path=Désignation, Mode=TwoWay}"  IndependentValuePath="ElementChimique" DependentValuePath="Valeur" IsSelectionEnabled="True">
    	<c:ColumnSeries.ColumnDataPointCollectionTemplate>
    		<DATATEMPLATE>
    			<l:ElementDataPoint ElementChimique="{Binding ElementChimique}" Valeur="{Binding Valeur}"/>
    		</DATATEMPLATE>
    	</c:ColumnSeries.ColumnDataPointCollectionTemplate>
    </c:ColumnSeries>
    ColumnDataPointCollectionTemplate n'est pas un membre de ColumnSeries donc pas moyen de définir un datatemplate.
    Il n'y a pas non plus d'objet ColumnDataPoint codable en XAML ce qui aurai arrangé les choses
    C'est pour ça qu'il faut que je trouve un moyen en XAML de définir une collection d'objet contenant 2 propriétés.
    Une pour contenir l'IndependantValue et l'autre pour contenir une propriété bindable contenant l'IdependantValue.
    Ensuite, il ne restera plus qu'à binder la propriété ItemsSource de la série sur la collection.

Discussions similaires

  1. [Débutant] Update Databindings sur objet perso
    Par a.floranc dans le forum VB.NET
    Réponses: 5
    Dernier message: 24/03/2013, 17h07
  2. [C# VS2005 CF]databinding liste d'objets sur un listview
    Par pdesoil dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/03/2007, 15h38
  3. pointeur multiple sur un objet
    Par Arnaud-h dans le forum C++Builder
    Réponses: 9
    Dernier message: 02/06/2004, 11h33
  4. [debutant] Contraintes d'intégrité définies sur un objet
    Par maysa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/05/2004, 14h57
  5. Requêtes : recherche de maxi sur plusieur Objet
    Par pertuis dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/03/2004, 15h28

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