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 :

wpf wrappanel bind ObservableCollection<Button>


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 39
    Points : 21
    Points
    21
    Par défaut wpf wrappanel bind ObservableCollection<Button>
    Bonjour,
    je sèche depuis des jours sur ce problème de bind. J'ai des usercontrol dans une ObservableCollection que j'aimerai visualiser dans un wrappanel.
    Pour simplifier j'ai fait un petit exemple avec une liste de boutons.

    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
    <Window x:Class="WpfApplication6.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Grid.RowDefinitions >
                <RowDefinition Height="50"/>
                <RowDefinition Height="50"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions >
                <ColumnDefinition Width="50"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Button x:Name="BtnAdd" Content="Add" Grid.Row="0" Grid.Column="0" Click="BtnAdd_Click"/>
            <Button x:Name="BtnRem" Content="Rem" Grid.Row="1" Grid.Column="0" Click="BtnRem_Click"/>
     
            <StackPanel Grid.Row="1" Grid.RowSpan="2" Grid.Column="1">
                <ItemsControl ItemsSource="{Binding  ListOfButtons}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel Orientation="Horizontal"/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>
            </StackPanel>
        </Grid>
    </Window>

    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
     
    namespace WpfApplication6
    {
        /// <summary>
        /// Logique d'interaction pour MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public ObservableCollection<Button> ListOfButtons = new ObservableCollection<Button> ();
            public MainWindow()
            {
                InitializeComponent(); 
            }
     
            private void BtnAdd_Click(object sender, RoutedEventArgs e)
            {
                Button btn = new Button ();
                btn.Content ="Bouton";
                ListOfButtons.Add(btn);
            }
     
            private void BtnRem_Click(object sender, RoutedEventArgs e)
            {
                ListOfButtons.RemoveAt(0);
            }
        }
    }
    Lorsque je clique sur le bouton Add, j'ai bien un bouton en plus dans la collection mais rien ne s'affiche. Je pense que c'est un problème simple, mais je ne n'arrive a rien.....

    Merci de votre aide

    MM

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je veux bien croire que peut-être
    n’empêche que normalement on ne fait pas ça

    le binding c'est plus prévu pour des classes non graphiques, et après on fait un datatemplate pour dire qu'on veut des boutons pour chaque élément non graphique

    et itemspanel ca doit servir à dire ce qu'on veut comme conteneur pour le listbox

    donc potasse encore peu et tu devrais y a arriver
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 39
    Points : 21
    Points
    21
    Par défaut
    ok
    dans ce cas comment faire?

    Le but au final c'est d'afficher une liste de UserControl qui se met à jour lors du changement d'un item dans la liste en question.
    J'ai pu faire fonctionné en ajouter dans le wrappanel chaque usercontrol de la liste et je rafraichissais sur un timer. En faisant un clear du wrap et en ajoutant a nouveau les éléments. Je ne trouve pas cela très propre, c'est pour cela que je voulais aller dans une autre voie.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il faut lire un tuto sur wpf, car ce n'est pas évident au début, et ca diffère des logiques de la plupart des langages usités (y compris c# windows forms)

    un exemple c'est que si tu as un observablecollection<personne> et que tu veux un usercontrol avec un textbox pour le nom, un pour le prénom et un bouton supprimer
    en fait il ne faut pas faire de usercontrol, mais faire un datatemplate à mettre dans itemscontrol.itemtemplate pour dire je veux un textbox bindé sur la propriété nom, un sur la propriété prenom et un bouton qui appelle la commande supprimé (trouver la classe RelayCommand qui permet de faire facilement (même si c'est indirect via une peoperty) du binding sur un void pour un bouton, command={binding macommandedesuppression}, enfin ca c'est en théorie, car il faudrait que la personne connaisse sa collection, ce qui n'est pas souvent le cas, mais dans ce cas une commande bindé sur le VM ira)

    l'interface et le code doivent donc être séparés
    enfin c'est le prédicat de base du MVVM, technique de codage conseillée en WPF, après libre à toi de faire ce que tu veux ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [Débutant] VB.net WPF : bonne pratique ? (Observablecollection List(of ) data binding)
    Par Gloubi99 dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 01/06/2015, 13h26
  2. [WPF DataBinding] Binding un peu compliqué
    Par thanatoster dans le forum Windows Presentation Foundation
    Réponses: 13
    Dernier message: 16/04/2008, 08h21
  3. [WPF - Blend] Binding lié à un click button
    Par OS_trimble dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 06/12/2007, 14h28
  4. [WPF][triggers] binding sur un DataView?
    Par bakonu dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 26/10/2007, 09h25
  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