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

VB.NET Discussion :

Binding List WPF


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    Par défaut Binding List WPF
    Bonjour à tous,

    Mon problème est le suivant :
    J'ai un objet commande qui a plusieurs propriétés dont une liste.
    Prenons par exemple une Liste(Of Materiau)
    Un matériau a un identifier et un label.

    A côté j'ai une listbox qui devra afficher une liste de commandes.
    Je veux donc "configurer" les Item. Donc pas de soucis pour ce qui est du n° de commande par exemple (un {Binding Path=NumCmd}) mais je souhaiterai aussi que dans un textblock apparaissent la liste des matériaux séparés par des virgules.

    Et c'est là que je bloque complètement.

    Je pourrai faire une classe CommandeItem qui reformaterait une commande puis faire le Binding à partir de celle ci mais cela me semble très sale.

    D'avance merci

  2. #2
    Membre Expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Par défaut
    Pour ce que j'en sais car je suis encore débutant en WPF vous devez lié votre item à une propriété. Donc vous n'aurez peut être pas le choix que de faire comme cela.

    Maintenant taper un peu binding converter dans google. Cela permet de faire des conversions avant affichage mais je n'ai pas encore vraiment creusé le sujet.
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour infosam76

    Effectivement c'est lourd (mais pas sale) alors que MaCommande.tostring peut sauver la vie dans certains cas .....

    Tes materiaux etant une prop Liste(Of Materiau) d'apres ta description,il suffit :
    -d'overrider ToString dans ton class MaCommande suivant ce que tu veux....
    Le petit travail à faire est de "reformatte" le contenu de ToString.....
    code des class MaCommande & MonMateriau
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    Imports System.ComponentModel
    Imports System.Collections.ObjectModel
     
    Public Class MaCommande
        Implements INotifyPropertyChanged
        Public Sub New()
            Numero = String.Empty
            Materiaux = New List(Of MonMateriau)
        End Sub
        Private m_Numero As String
        Public Property Numero() As String
            Get
                Return m_Numero
            End Get
            Set(ByVal value As String)
                m_Numero = value
                OnPropChanged("Numero")
            End Set
        End Property
        Private m_Materiaux As List(Of MonMateriau)
        Public Property Materiaux() As List(Of MonMateriau)
            Get
                Return m_Materiaux
            End Get
            Set(ByVal value As List(Of MonMateriau))
                m_Materiaux = value
                OnPropChanged("Materiaux")
            End Set
        End Property
        '--------------the overrides---------------------
        Public Overrides Function ToString() As String
            Dim s As String = ""
            If Me.Materiaux.Count <> 0 Then
                For i = 0 To Me.Materiaux.Count - 1
                    s = s + Me.Numero + "=>" + Me.Materiaux(i).ID + " , " + Me.Materiaux(i).Label + " ; " + vbCrLf
                Next
            End If
            Return s
     
        End Function
        Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
        Private Sub OnPropChanged(ByVal NameProp As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameProp))
     
        End Sub
     
    End Class
    Public Class ListCommands
        Inherits ObservableCollection(Of MaCommande)
        Private cmd As MaCommande
        Private mat As MonMateriau
        Private nbMat As Random = New Random
        Private numMat As Random = New Random
        Public Sub New()
            For i As Integer = 1 To 5
                cmd = New MaCommande
                cmd.Numero = "cmd" + i.ToString
                cmd.Materiaux = New List(Of MonMateriau)
     
                For j As Integer = 1 To nbMat.Next(1, 8)
                    Dim n As Integer = numMat.Next(50, 100)
                    mat = New MonMateriau("mat" + n.ToString, "label" + n.ToString)
                    cmd.Materiaux.Add(mat)
                Next
                Me.Add(cmd)
            Next
     
        End Sub
     
    End Class
    Public Class MonMateriau
        Implements INotifyPropertyChanged
        Public Sub New(ByVal xid As String, ByVal xlbl As String)
            ID = xid
            Label = xlbl
     
        End Sub
        Private m_ID As String
        Public Property ID() As String
            Get
                Return m_ID
            End Get
            Set(ByVal value As String)
                m_ID = value
                OnPropChanged("ID")
            End Set
        End Property
        Private m_Label As String
        Public Property Label() As String
            Get
                Return m_Label
            End Get
            Set(ByVal value As String)
                m_Label = value
                OnPropChanged("Label")
            End Set
        End Property
     
        Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
        Private Sub OnPropChanged(ByVal NameProp As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameProp))
     
        End Sub
    End Class
    code xaml du winform:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    <Window x:Class="Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfTextBockDispayList"
        Title="Window2" Height="300" Width="300">
        <Window.Resources>
            <local:ListCommands x:Key="datalist"></local:ListCommands>
        </Window.Resources>
        <DockPanel>
            <ListBox
                x:Name="lb"
                DockPanel.Dock="Left"
                IsSynchronizedWithCurrentItem="True"
                ItemsSource="{StaticResource datalist}"
                SelectedValue="00"
                SelectedValuePath="MaCommande.Materiaux">
                <ListBox.ItemTemplate>
                    <DataTemplate DataType="{x:Type local:MaCommande}">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock 
                                Margin="5"
                                FontSize="14"
                                Foreground="Red"
                                Text="{Binding Numero}">
                            </TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <TextBlock
                DockPanel.Dock="Left"
                Margin="5"
                FontSize="16"
                Foreground="Red"
                TextAlignment="Center"
                Text="{Binding  ElementName=lb,Path=SelectedItem}">
            </TextBlock>
        </DockPanel>
    </Window>
    bon code...............

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    overrider tostring en windows forms ok, en wpf ca m'étonne un peu plus

    il suffit de faire une readonly property qui concatène, et c'est cette propriété qui sera bindée
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour Samyy17 et Pol63

    Cette restriction en wpf s'applique aux controles mais pas à des class data "utilisateurs data" comme MaCommande....

    Effectivement pour un control wpf tostring renvoie le nom qualifie du control...y compris le namespace.....mais neanmoins relativement à la surcharge de la methode ToString d'un control wpf voici ce que dit la MSDN Doc (rubrique de Control).....
    Control..::.ToString, méthode
    Retourne une représentation sous forme de chaîne de l'objet Control
    Visual Basic (Utilisation)
    Public Overrides Function ToString As String
    C#
    public override string ToString()

    Valeur de retour
    Type : System..::.String
    Chaîne qui représente le contrôle .

    Notes
    Les auteurs de contrôle doivent substituer cette méthode pour retourner une chaîne qui contient des informations qui seraient intéressantes pour les consommateurs du contrôle.
    je ne vois ou se situe le probleme .....
    bon code.......................

Discussions similaires

  1. Binding List<UserControl> to Repeater
    Par g_tarik0010 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 30/12/2011, 05h24
  2. [C#] Binding DataGrid WPF
    Par ToupetMan dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 24/08/2011, 19h19
  3. Pbm Binding Datagridview WPF (& LINQ)
    Par cr0mat dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 13/12/2009, 22h47
  4. binding et wpf sur listbox
    Par MarioKart dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 28/07/2009, 19h39
  5. Binding List<DateTime> sur DateTimePicker
    Par OAJLI dans le forum Windows Forms
    Réponses: 5
    Dernier message: 18/09/2008, 14h08

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