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

C# Discussion :

Combobox binding XAML sans wpf [Débutant]


Sujet :

C#

  1. #1
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 383
    Par défaut Combobox binding XAML sans wpf
    Bonjour,
    Je découvre le les interfaces graphiques C# WPF et j'essayais de faire une liaison d'une liste et d'un combobox via le XAML sans devoir utiliser le WPF.
    Je m'explique

    J'ai une liste que j'initialise au début avant de lancer la fenêtre.
    j'ai donc essayé de faire un binding à mon combobox avec le nom de ma liste mais sans succes.
    Je suis obligé de rajouter pour le moment la ligne ListCombobox.ItemsSource = lSrv;
    Voici le code
    Code C# - WPF : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public ObservableCollection<Server> lSrv { get => _lSrv; set => _lSrv = value; }
     
    public MainWindow()
    {
        InitListServers();
        InitializeComponent();
        CmbBox.ItemsSource = lSrv; //ligne que j'aimerais supprimer
    }
    Code C# - XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Grid>
        <ComboBox Name="CmbBox" ItemsSource ="{Binding Path=lSrv}"/>
    </Grid>

    Merci pour votre aide

  2. #2
    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

    j'essayais de faire une liaison d'une liste et d'un combobox via le XAML sans devoir utiliser le WPF.
    code exemple combo
    1/ code behind .cs du class data exemple:
    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
    using System;
    using System.Collections.Generic;
     
    namespace WpfComboExemple
    {
        public class User
        {
            public int Id { get; set; }
            public string Nom { get; set; }
            public double Salaire  { get; set; }
            public User()
            {}
        }
        public class ListUsers:List<User>
        {
            private Random rnd = new Random();
            public ListUsers()
            {
                for (int i = 1; i < 11; i++)
                {
                    User user = new User() 
                    { 
                        Id = i, 
                        Nom = "user" + i.ToString(),
                        Salaire=rnd.Next(1050,2501)
                    };
                    this.Add(user);
                }
            }
        }
    }
    code xaml de la fenêtre :
    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="WpfComboExemple.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfComboExemple" 
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <local:ListUsers x:Key="src"/>
        </Window.Resources>
        <Grid >
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <ComboBox 
                Grid.Row="0"
                x:Name="cbo"
                Width="120"
                IsEditable="true"  
                IsReadOnly="true" 
                SelectedValuePath="Salaire"
                ItemsSource="{Binding Source={StaticResource src}}">
     
                <ComboBox.ItemTemplate>
                    <DataTemplate DataType="{x:Type local:User}">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Nom}"  />
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
            <StackPanel  
                Grid.Row="1"
                Background="Beige"
                >
                <TextBlock Margin="5" Text="{Binding ElementName=cbo,Path=SelectedItem.Id}"  />
                <TextBlock Margin="5" Text="{Binding ElementName=cbo,Path=SelectedItem.Nom}"  />
                <TextBlock Margin="5" Text="{Binding ElementName=cbo,Path=SelectedValue}"  />
            </StackPanel>
        </Grid>
    </Window>
    pas de code behind ....
    -

  3. #3
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 383
    Par défaut
    Je suis occupé de tester mais suis-je obligé de créer un classe liste? ou la classe user + une fonction qui ajoute des éléments dans la liste avant l'initialisation de la fenêtre suffit?
    Autre question je vois souvent des code ou il y a un "x:" x:name devant, pourquoi ce "x:"?
    J'ai essayé 2-3 trucs pour faire comme toi.
    Mais j'obtiens cette erreur.
    Nom : Wx2F39OsT2q1G3uu3J6-Ow.png
Affichages : 558
Taille : 5,5 Ko
    Qu'est donc l'espace de noms?
    N'y à-t-il pas moyen de faire la même chose sans créer de classe?
    Car (corriges moi si je me trompes) la fenêtre si elle est crée après la liste elle peut directement accéder à la liste non?
    Merci

  4. #4
    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
    rebonjour

    Un class custom et un class List sont exigibles pour faire du binding avec un combo Wpf...

    - x:Key est une clé de type string qui permet de gerer un dictionaire de RESOURCES WP
    Car il peut y avoir plusieurs class en dans le dictionnaire (x:Key ="src1" pour user1, x:key="src2" pour user2 etc...

    - x:Name lui est simplement le nom du control ,par exemple x:name="cbo" est le nom du Combo exemple qu'on peut utiliser dans le code behind...

    Pour le reste il faut lire la FAQ WPF du Forum ,il y a des tutos...

  5. #5
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 383
    Par défaut
    Ça va merci Quand aux tuto forum j'ai déjà commencé car nos cours en C# wpf sont vraiment bâclés. La donc des cours est plutôt le net que nos syllabus malheureusement.

  6. #6
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 204
    Par défaut
    Bonjour,

    Il n'y a pas plus simple ? Je ferais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public ObservableCollection<Server> lSrv { get => _lSrv; set => _lSrv = value; }
     
    public MainWindow()
    {
        InitListServers();
        InitializeComponent();
     
    	this.DataContext = this;
    }
    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Grid>
        <ComboBox Name="CmbBox" ItemsSource ="{Binding Path=lSrv}"/>
    </Grid>

    Maintenant le DataContext est ta MainWindow et tu as donc accès à la variable lSrv depuis le XAML.

  7. #7
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 383
    Par défaut
    oui j'ai compris cela mais ce que je ne comprends pas c'est pourquoi je dois le lier en wpf (CmbBox.ItemsSource = lSrv;) alrs que je le lie déjà coté xaml.

  8. #8
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 204

  9. #9
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    Parce-que ton binding {Binding Path=lSrv} implique de rechercher la propriété lSrv sur le DataContext de la ComboBox. Or ce DataContext n'est jamais affecté. Il faudrait rajouter dans le constructeur de la MainWindow soit CmbBox.DataContext = this; pour le "setter" directement, soit DataContext = this;(comme le propose WDKyle) pour l'obtenir par transitivité. Quoi qu'il en soit dans les deux c'est une mauvais approche qui n'est pas en concordance avec la manière de faire en WPF (qui attend plutôt architecture MVVM).

  10. #10
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 204
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Quoi qu'il en soit dans les deux c'est une mauvais approche qui n'est pas en concordance avec la manière de faire en WPF (qui attend plutôt architecture MVVM).
    Quelle serait la bonne approche selon toi ?

    Merci.

  11. #11
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    Passer par du MVVM, comme recommandé dans le post que tu as mis en lien. Avec MVVMLight c'est relativement facile.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/03/2017, 09h35
  2. [WPF] ComboBox, binding avec association LINQ
    Par tomlev dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 30/04/2008, 00h30
  3. problème binding xaml
    Par cyberchand dans le forum C#
    Réponses: 6
    Dernier message: 14/02/2007, 16h10
  4. [VS2005] Datagridview et combobox binding
    Par s.n.a.f.u dans le forum Visual Studio
    Réponses: 3
    Dernier message: 13/12/2006, 16h15
  5. [VS2005][C#]Formulaire, ComboBox bindings
    Par Oufti dans le forum Windows Forms
    Réponses: 8
    Dernier message: 07/06/2006, 18h14

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