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 :

Echange de valeurs entre deux fenêtres en C#-WPF


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Echange de valeurs entre deux fenêtres en C#-WPF
    Bonjour,

    j'ai deux fenêtres wpf (MainWindow et Question) contenant deux propriétés de même type " List<> " chacune.

    public List<Article> ListeArticle2 = new List<Article>(); pour MainWindow et

    public List<Article> ArticlesListe{get; set; } pour Question

    Ce que je souhaite faire est de faire une affectation de valeur juste avant d'afficher la fenêtre Question.

    voici le code behind ça vous aidera peut-être à mieux comprendre ma préoccupation.

    dans MainWindow

    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
     
     
    public partial class MainWindow : Window 
     {
     
     
     
            public List<Article> ListeArticle2 = new List<Article>();
            public MainWindow()
            {
                InitializeComponent();          
            }
     
        private void btnAjoutArticl_Click(object sender, RoutedEventArgs e)
        {
               ListeArticle2.Add(new Article() 
               { 
                ID = TextRefSearch.Text,
                Design = TextDesSearch.Text,
                Qte = int.Parse(TextEnterQteSearch.Text),
     
               });
     
     
                           Question quest = new Question();            
     //Point d'arrêt       quest.ArticlesListe = ListeArticle2;
                           quest.ShowDialog();
     
          }
    }
    dans Question:

    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
     
     
          public List<Article> ArticlesListe{get; set; }      
     
            public Question()
            {
                InitializeComponent();
            }
     
     
            private void AjouterVente()
            {
     
                foreach (var item in ArticlesListe)
                {
     
                    TextBox1.Text = vente.ID;
                    TextBox2.Text = item.Qte;
                }
     
     
     
     
     
            }
     
     
    }
    lorsque j'éffectue un point d'arrêt que je parcour les données je remarque bien que ListeArticle2 contient bien des données mais l'autre List est vide.

    Aidez-moi svp!

    merci.

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Bizarre...donc quand tu arrives sur la ligne quest.ShowDialog en débug (avec la ligne précédente décommentée, évidemment), il n'y a rien dans la liste cible, mais la liste source est remplie, c'est bien ça?

  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

    Tu dois utiliser les "vases communicants" des datacontext des forms pour la maj des 2 UI:

    Operations à faire MainWindow:

    - proc New : init ListeArticle2 et le lie au datacontext du form
    - proc Load : init le form WinQuestiont (what) & fait pointer sa liste WinQuestion.ArticlesListe sur => ListeArticle2...& Show...

    Operations à faire sur le form WinQuestion:

    -un setter specifique pour son ArticlesListe qui sette aussi le datacontext des que sa liste est initialise pour mettre à jour ses controles...

    -2 textblocks et un 1er listbox bindes au datacontext...

    -un button btnAjoutVente pour "ratisser" le contenu de ArticlesListe et l'afficher dans un 2eme listbox non binde au datacontext celui-la...

    code .cs class Article
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel;
    using System.Collections.ObjectModel;
     
    namespace WpfBindingForms
    {
        public class Article:INotifyPropertyChanged
        {
            private string id;
            public string ID
            {
                get { return id; }
                set 
                { 
                    id = value; 
                    RaisePropertyChanged("ID");
                }
            }
            private int qte;
            public int Qte
            {
                get { return qte; }
                set
                { 
                    qte = value;
                    RaisePropertyChanged("Qte");
                }
            }
     
     
     
     
            public event PropertyChangedEventHandler PropertyChanged;
            private void RaisePropertyChanged(string nameProp)
            {
                PropertyChangedEventHandler h = PropertyChanged;
                if (h != null)
                {
                    h(this, new PropertyChangedEventArgs(nameProp));
                }
     
            }
        }
     
     
    }
    code xaml de MainWindow:

    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
     
    <Window x:Class="WpfBindingForms.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfBindingForms"
            Title="MainWindow" Height="350" Width="525"
            Loaded="Window_Loaded" Closing="Window_Closing"
            >
        <!-- idem :tous les controles sont lies par defaut au DataContext du Form -->
        <StackPanel >
            <Button x:Name="btnAjoutArticle" Content="AjoutArticle"
                    Click="btnAjoutArticle_Click"/>        
            <DockPanel>
                <Label Content="ID" Background="Beige" ></Label>
                <TextBox  Margin="5" x:Name="txtID" Width="100"
                          Text="{Binding Path=ID,UpdateSourceTrigger=PropertyChanged}"/>
                <Label Content="Qte" Background="Beige"></Label>
                <TextBox  Margin="5" x:Name="txtQte" Width="100"  
                          Text="{Binding Path=Qte,UpdateSourceTrigger=PropertyChanged}"/>
            </DockPanel>
            <ListBox
                x:Name="lb"
                IsSynchronizedWithCurrentItem="True"
                ItemsSource="{Binding }">
                <ListBox.ItemTemplate>
                    <DataTemplate DataType="{x:Type local:Article}">
                        <StackPanel  Orientation="Horizontal" >
                            <TextBlock Margin="5" Text="{Binding Path=ID}"></TextBlock>
                            <TextBlock Margin="5" Text="{Binding Path=Qte}"></TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
     
        </StackPanel>
    </Window>
    code behind .cs de MainWindow:
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Collections.ObjectModel;
     
    namespace WpfBindingForms
    {
        /// <summary>
        /// Logique d'interaction pour MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            //question What 
            private WinQuestion questWhat;
            public ObservableCollection<Article> ListeArticle2 { get; set; }
     
            public MainWindow()
            {
                InitializeComponent();
     
                // le "vase communicant" du DataContext  
                ListeArticle2 = new ObservableCollection<Article>(); 
                this.DataContext = ListeArticle2;
            }
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                questWhat = new WinQuestion();
     
                //initialise ArticlesListe avec  instance  de liste 2
                //questWhat s'occupera de lier son datacontext à sa propre liste
                questWhat.ArticlesListe = this.ListeArticle2;
                questWhat.Show();
                questWhat.Topmost = true;
            }
     
            int count = 1;
            private void btnAjoutArticle_Click(object sender, RoutedEventArgs e)
            {
                txtID.Text = "ID" + string.Format("{0}{1}", "0", count);
                txtQte.Text = count.ToString();
                ListeArticle2.Add(new Article()
                {
                    ID = txtID.Text,
                    Qte = int.Parse(txtQte.Text)
     
                });
                count++;
            }
     
     
            private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
            {
                if (questWhat != null)
                {
                    questWhat.Close();
                }
            }
        }
    }
    code xaml du form WinQuestion:
    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
     
    <Window x:Class="WpfBindingForms.WinQuestion"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfBindingForms"
            Title="WinQuestion" Height="300" Width="300"
            >
        <!-- idem :tous les controles sont lies par defaut au DataContext du Form -->
        <StackPanel >
            <DockPanel>
                <Label Margin="5" Content="ID" Background="Magenta" />
                <TextBlock Margin="5"   Text="{Binding Path=ID}"/>
                <Label Margin="5" Content="Qte" Background="Magenta"/>
                <TextBlock Margin="5" Text="{Binding Path=Qte}"/>
            </DockPanel>
            <!--IsSynchronizedWithCurrentItem="True" :ne pas oublier de synchroniser 
            l'affichage des controles lies à un meme DataContext !!!-->
            <ListBox
                x:Name="lb"
                IsSynchronizedWithCurrentItem="True"
                ItemsSource="{Binding}">
                <ListBox.ItemTemplate>
                    <DataTemplate DataType="{x:Type local:Article}">
                        <StackPanel  Orientation="Horizontal" >
                            <TextBlock Margin="5" Text="{Binding Path=ID}"></TextBlock>
                            <TextBlock Margin="5" Text="{Binding Path=Qte}"></TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <Button x:Name="btnAjoutVente" Content="AjoutVente"
                    Click="btnAjoutVente_Click"/>
     
            <!--Pas de Binding pour ce ListBox Ajout par CODE !!!-->
            <ListBox
                x:Name="lbVentes"
                >
                <ListBox.ItemTemplate>
                    <DataTemplate DataType="{x:Type local:Article}">
                        <StackPanel  Orientation="Horizontal" >
                            <TextBlock Margin="5" Text="{Binding Path=ID}"></TextBlock>
                            <TextBlock Margin="5" Text="{Binding Path=Qte}"></TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </StackPanel>
    </Window>
    code behind .cs du form WinQuestion:

    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;
    using System.Collections.ObjectModel;
     
    namespace WpfBindingForms
    {
        /// <summary>
        /// Logique d'interaction pour Window1.xaml
        /// </summary>
        public partial class WinQuestion : Window
        {
     
            private ObservableCollection<Article> articlesListe=null; 
            public ObservableCollection<Article> ArticlesListe 
            { 
                get {return articlesListe;}
                set
                {
                    articlesListe = value;
                    if (articlesListe != null)
                    {
                        this.DataContext = ArticlesListe;
                    }
                }
            }
     
     
            public WinQuestion()
            {
                InitializeComponent();
     
     
            }
     
     
            //je presume que le proc AjouterVente fait autre chose de plus logique ....
            private void btnAjoutVente_Click(object sender, RoutedEventArgs e)
            {
                AjouterVente();
            }
            private void AjouterVente()
            {
     
                foreach (var item in ArticlesListe)
                {
     
                  this.lbVentes.Items.Add(item);
     
                }
            }
     
        }
    }
    bon code...

Discussions similaires

  1. Echange de valeurs entre deux Strings
    Par Daborem dans le forum Débuter
    Réponses: 6
    Dernier message: 31/05/2015, 09h02
  2. Echanger les valeurs entre deux select
    Par otmaneo01 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/03/2015, 11h13
  3. Passage d'information entre deux fenêtres
    Par kuuya dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/08/2005, 14h35
  4. Passer une variable entre deux fenêtres
    Par DeezerD dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/08/2005, 09h52
  5. [TP] Echanger des données entre deux programmes
    Par ILIAS Raphaël dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 22/03/2005, 09h31

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