Menu

Associé du text et un élement Bindind dans un texrbox [Résolu]

Messages postés
26
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
21 mai 2019
- - Dernière réponse : Whismeril
Messages postés
13301
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 mai 2019
- 21 mai 2019 à 06:55
Bonjour,

Je suis débutante en WPF et je suis fasse a un problème. J'essaye, dans une même textbox d'afficher à la fois du texte et des élément binder. Ce code est écrit dans la partie C# car il s'affiche lorsque on appuie sur un bouton. Es possible à réaliser ? Et si oui comment, car j'arrive soit à afficher le texte soit les éléments binder.

Merci d'avance pour vos réponse.
Cordialement.

Configuration: Android / Chrome 74.0.3729.136
Afficher la suite 

Votre réponse

7 réponses

Messages postés
13301
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 mai 2019
341
0
Merci
Bonsoir,

quel est le type de l'élément bindé et quel genre de texte est à associer?

Par ce que par exemple, si on parle d'une vitesse, stockée dans un double, avec un stringFormat dans le binding, tu peux afficher un truc de ce genre
"La vitesse est de 40,2 km/h"
alors que la valeur stockée est 40.198
Hamster18
Messages postés
26
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
21 mai 2019
-
Il y a un int, des string et un bool qui si c'est true, il affiche oui et si c'est false il affiche non
Commenter la réponse de Whismeril
Messages postés
13301
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 mai 2019
341
0
Merci
Et tout ça dans un seul textBox?
Ou à la suite?

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Hamster18
Messages postés
26
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
21 mai 2019
-
L’idéal serait que tout c'est élément soit dans une même textBox...
Commenter la réponse de Whismeril
Messages postés
13301
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 mai 2019
341
0
Merci
Alors le plus simple est de créer une propriété dédiée dans la classe bindée.

Par exemple cette classe
    class ExempleHamster18 : INotifyPropertyChanged
    {
        private int entier;
        /// <summary>
        /// Entier
        /// </summary>
        public int Entier
        {
            get { return entier; }
            set
            {
                if (entier != value)
                {
                    entier = value;
                    GenerePropertyChanged("Entier");
                }
            }
        }

        private string texte1;
        /// <summary>
        /// Texte 1
        /// </summary>
        public string Texte1
        {
            get { return texte1; }
            set
            {
                if (texte1 != value)
                {
                    texte1 = value;
                    GenerePropertyChanged("Texte1");
                }
            }
        }

        private string texte2;
        /// <summary>
        /// Texte 2
        /// </summary>
        public string Texte2
        {
            get { return texte2; }
            set
            {
                if (texte2 != value)
                {
                    texte2 = value;
                    GenerePropertyChanged("Texte2");
                }
            }
        }

        private bool booleen;
        /// <summary>
        /// Booléen
        /// </summary>
        public bool Booleen
        {
            get { return booleen; }
            set
            {
                if (booleen != value)
                {
                    booleen = value;
                    GenerePropertyChanged("Booleen");
                }
            }
        }


        private DateTime date;
        /// <summary>
        /// Date
        /// </summary>
        public DateTime Date
        {
            get { return date; }
            set
            {
                if (date != value)
                {
                    date = value;
                    GenerePropertyChanged("Date");
                }
            }
        }


        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        private void GenerePropertyChanged(string Propriete)
        {
            if (this.PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(Propriete));
        }

        #endregion
    }


On veut créer un texte qui contient l'entier, les 2 textes et le booléen, mais pas la date.
On ajoute une propriété en lecture seule qui retourne le nouveau texte, et on signale qu'elle est modifiée à chaque modification d'un composant
    class ExempleHamster18 : INotifyPropertyChanged
    {
        private int entier;
        /// <summary>
        /// Entier
        /// </summary>
        public int Entier
        {
            get { return entier; }
            set
            {
                if (entier != value)
                {
                    entier = value;
                    GenerePropertyChanged("Entier");
                    GenerePropertyChanged("Resume");
                }
            }
        }

        private string texte1;
        /// <summary>
        /// Texte 1
        /// </summary>
        public string Texte1
        {
            get { return texte1; }
            set
            {
                if (texte1 != value)
                {
                    texte1 = value;
                    GenerePropertyChanged("Texte1");
                    GenerePropertyChanged("Resume");
                }
            }
        }

        private string texte2;
        /// <summary>
        /// Texte 2
        /// </summary>
        public string Texte2
        {
            get { return texte2; }
            set
            {
                if (texte2 != value)
                {
                    texte2 = value;
                    GenerePropertyChanged("Texte2");
                    GenerePropertyChanged("Resume");
                }
            }
        }

        private bool booleen;
        /// <summary>
        /// Booléen
        /// </summary>
        public bool Booleen
        {
            get { return booleen; }
            set
            {
                if (booleen != value)
                {
                    booleen = value;
                    GenerePropertyChanged("Booleen");
                    GenerePropertyChanged("Resume");
                }
            }
        }


        private DateTime date;
        /// <summary>
        /// Date
        /// </summary>
        public DateTime Date
        {
            get { return date; }
            set
            {
                if (date != value)
                {
                    date = value;
                    GenerePropertyChanged("Date");
                }
            }
        }

        /// <summary>
        /// Retourne un résumé des propriétés
        /// </summary>
        public string Resume
        {
            get
            {
                return string.Format("Le texte 1 est '{0}, l'entier est '{1}', les texte 2 est {2}, et tout ça est {3}", texte1, entier, texte2, booleen ? "OK" : "KO");
            }
        }
    

        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        private void GenerePropertyChanged(string Propriete)
        {
            if (this.PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(Propriete));
        }

        #endregion
    }


et le xaml
        <TextBlock Text="{Binding Resume, UpdateSourceTrigger=PropertyChanged}"/>


Mais il est tout aussi efficace de mettre un stackpanel horizontal ou un wrappanel et d'y mettre (par exemple) un label pour texte 1, un textblock pour l'entier, un textbox texte 2 et un autre avec un Conveter pour le booléen.

Hamster18
Messages postés
26
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
21 mai 2019
-
Bonjour, j'ai tenter d'effectuer votre code cependant, il me met toute ma textBox en souligner bleu avec l'erreur "type Inline attendu". Avez vous une idée d'où peut bien venir ce problème ?
Cordialement.
Merci d'avance.
Commenter la réponse de Whismeril
Messages postés
13301
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 mai 2019
341
0
Merci
Bonsoir

sans ton code, le contenu de la variable et le texte exact de l'erreur, j'en ai pas la moindre idée.
Hamster18
Messages postés
26
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
21 mai 2019
-
D'accord.
J'ai remodifier mon code .. Il m'affiche plus l'erreur dite précédemment mais l'appelle de la méthode "Convert" (classe BiblioSerie) dans le code C# ne fonctionne pas.
Voici mon code :

Ma classe bibliothèque que contient la liste de série :

namespace Atsa
{

    [System.Windows.Data.ValueConversion(typeof(Serie), typeof(string))]

    public class BiblioSerie : System.Windows.Data.IMultiValueConverter
    {
        public List<Serie> ListSerie { get { return GetAll(); } }

        public List<Serie> GetAll()
        {
            return new List<Serie>()
            {
            new Serie("Grey's Anatomy","27/03/2005",true,4, "Medias/Photos/Serie_Grey-s_anatomy.jpg", 15,
            "Meredith Grey, fille d'un chirurgien très réputé, commence son internat de première année" +
            " en médecine chirurgicale dans un hôpital de Seattle. La jeune femme s'efforce de maintenir " +
            "de bonnes relations avec ses camarades internes, mais dans ce métier difficile la compétition" +
            " fait rage..."),
            new Serie("Lucifer", "26/01/2016", false,5, "Medias/Photos/Serie_Lucifer.png", 5, "Lassé et mécontent" +
            " de sa position de Seigneur des Enfers, Lucifer Morningstar démissionne et abandonne son royaume" +
            " pour la bouillonnante Los Angeles. Dans la Cité des anges, l'ex maître diabolique est le patron" +
            " d'un nightclub baptisé Lux."),
            new Serie("The 100", "19/03/2014",true,4, "Medias/Photos/Serie_The_100.jpg", 3, "Après une apocalypse" +
            " nucléaire, les 318 survivants se réfugient dans des stations spatiales et parviennent à y vivre et" +
            " à se reproduire, atteignant le nombre de 4000 ; 97 ans plus tard, une centaine de jeunes délinquants" +
            " redescendent sur Terre."),
            new Serie("The Walking Dead", "20/03/2011",true,8, "Medias/Photos/Serie_The_walking_dead.jpg", 9, "Après" +
            " une apocalypse ayant transformé la quasi-totalité de la population en zombies, un groupe d'hommes et de" +
            " femmes mené par l'officier Rick Grimes tente de survivre. Ensemble, ils vont devoir tant bien que mal" +
            " faire face à ce nouveau monde.")
            };
        }
      
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            string nom = values[0] as string;
            string sortie = values[1] as string;
            int saison = (int)values[2];
            bool encours = (bool)values[3];



            string contenu = string.Format("Titre : {0} \n Sortie : {1} \n Nombre de saison : {2} \n", nom, sortie, saison
                );
            if (encours == true)
            {
                return contenu + " oui";
            }
            return contenu + " non";
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}







La classe Serie :




namespace Atsa.Classes
{
    public class Serie : INotifyPropertyChanged
    {
          
        private int genre;
        /// <summary>
        /// Entier
        /// </summary>
        public int Genre
        {
            get { return genre; }
            set
            {
                if (genre != value)
                {
                    genre = value;
                    GenerePropertyChanged("Genre");
                    GenerePropertyChanged("Resume");
                }
            }
        }

        private int nb_saison;
        /// <summary>
        /// Entier
        /// </summary>
        public int NbDeSaison
        {
            get { return nb_saison; }
            set
            {
                if (nb_saison != value)
                {
                    nb_saison = value;
                    GenerePropertyChanged("NbDeSaison");
                    GenerePropertyChanged("Resume");
                }
            }
        }


        private string nom;
        /// <summary>
        /// Texte 1
        /// </summary>
        public string Nom
        {
            get { return nom; }
            set
            {
                if (nom != value)
                {
                    nom = value;
                    GenerePropertyChanged("Nom");
                    GenerePropertyChanged("Resume");
                }
            }
        }

        private string images;
        /// <summary>
        /// Texte 1
        /// </summary>
        public string Images
        {
            get { return images; }
            set
            {
                if (images != value)
                {
                    images = value;
                    GenerePropertyChanged("Images");
                    GenerePropertyChanged("Resume");
                }
            }
        }

        private string date_de_sortie;
        /// <summary>
        /// Texte 2
        /// </summary>
        public string DateDeSortie
        {
            get { return date_de_sortie; }
            set
            {
                if (date_de_sortie != value)
                {
                    date_de_sortie = value;
                    GenerePropertyChanged("DateDeSortie");
                    GenerePropertyChanged("Resume");
                }
            }
        }



        private string resumer;
        /// <summary>
        /// Texte 1
        /// </summary>
        public string Resumer
        {
            get { return resumer; }
            set
            {
                if (resumer != value)
                {
                    resumer = value;
                    GenerePropertyChanged("Resumer");
                    GenerePropertyChanged("Resume");
                }
            }
        }

        private bool encours;
        /// <summary>
        /// Booléen
        /// </summary>
        public bool EnCours
        {
            get { return encours; }
            set
            {
                if (encours != value)
                {
                    encours = value;
                    GenerePropertyChanged("EnCours");
                    GenerePropertyChanged("Resume");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void GenerePropertyChanged(string Propriete)
        {
            if (this.PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(Propriete));
        }

        public Serie(String nom, String date_de_sortie, bool en_cours, int genre, String image, int nb_saison, string resumer)
        {
            this.Nom = nom;
            this.DateDeSortie = date_de_sortie;
            this.EnCours = en_cours;
            this.Genre = genre;
            this.Images = image;
            this.Resumer = resumer;
            this.NbDeSaison = nb_saison;
        }

    }
}









et mon code XAML :



<Grid >
                

            <StackPanel DataContext="{Binding BiblioSerie.ListSerie, ElementName=Saison1}">

                
                <WrapPanel Margin="10" HorizontalAlignment="Center">
                    <ToggleButton Name="Descriptions" Click="Descriptions_Click" Padding="10,5" Width="105" Content="Description" ></ToggleButton>
                    <ToggleButton Name="Informations"  Click="Info_Click" Padding="10,5" Width="105" Content="Information" ></ToggleButton>
                </WrapPanel>


                <StackPanel>
                    <TextBlock Text="{Binding Convert, UpdateSourceTrigger=PropertyChanged}" TextAlignment="Center" TextWrapping="Wrap" Name="Text_description1">

              
                    </TextBlock>
                </StackPanel>














 public partial class Saison_Grey_s_anatomy : Window
    {
         public Saison_Grey_s_anatomy()
        {
            InitializeComponent();

    }
        public BiblioSerie BiblioSerie { get; set; } = new BiblioSerie();
        public BiblioSaison BiblioSaison { get; set; } = new BiblioSaison();


        private void Descriptions_Click(object sender, RoutedEventArgs e)
        {

            var BiblioSerie = new BiblioSerie();
            Binding mBindingNom = new Binding("ListSerie[0]");
            mBindingNom.Source = BiblioSerie.Convert;
            var resumer = this.Text_description1.SetBinding(TextBlock.TextProperty, mBindingNom);
        }


        private void Info_Click(object sender, RoutedEventArgs e)
        {
            var BiblioSerie = new BiblioSerie();
            Binding mBindingNom = new Binding("ListSerie[0].Resumer");

            mBindingNom.Source = BiblioSerie;
            var resumer = this.Text_description1.SetBinding(TextBlock.TextProperty, mBindingNom);
        }


    }
}


Commenter la réponse de Whismeril
Messages postés
13301
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 mai 2019
341
0
Merci
, j'ai tenter d'effectuer votre code cependant,

Alors déjà, c'est pas du tout ce que je t'ai proposé, un converter est une façon de faire, parfaitement adaptée au MVC ou MMVC, mais ce que je t'ai proposé -> composer ton texte dans la classe métier, me paraissait plus accessible à un débutant.

Un converter c'est pas une classe métier, donc ta liste de séries n'a rien à y faire.

Un converter ça sert, coté interface, à décrire comment WPF doit afficher une donnée.
Par exemple, on a un double qui stocke une température, le converter va retourner une couleur qui va du bleu nuit au jaune intense selon la température, avec la méthode Convert.
La méthode ConvertBAch servant à l'opération inverse.
Oui encore tu as un bool et tu veux voir une coche verte si c'est true et une croix rouge si c'est false.

Du coup, un converter n'est pas un datacontext. Ça s'appelle, au moment du binding.
Voir ici comment cela s'utilise
https://www.wpf-tutorial.com/fr/39/data-binding/conversion-de-valeur-avec-ivalueconverter/
Hamster18
Messages postés
26
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
21 mai 2019
-
D'accord je voit pourquoi ma méthode ne fonctionne pas, mais si je créé une méthode Resume dans BiblioSerie comment la faire appeler depuis mon code C# ? Et comment faire pour que Resume fonctionne ?
En gros ce que je veux exactement faire c'est que j'ai un textBlock dans ma view et si je clique sur le bouton description ça affiche le texte que j'essaye de former ( le texte avec les éléments bindés) et si je clique sur l'autre bouton, je veux qui s'afficher un string bindé ( cette partie fonctionne) dans la même textBox à la place de l'autre affichage.
Commenter la réponse de Whismeril
Messages postés
13301
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 mai 2019
341
0
Merci
Alors, ta méthode Resume tu lui mets un paramètre (un bool par exemple)
Si c'est true tu construis le 1er texte et si c'est false tu construis le 2eme.
Le texte ainsi construit, tu l'affectes à une propriété (MonTexteDeSortie, par exemple).
C'est cette propriété que tu bindes à ton textblock
Elle doit déclencher l'événement PropertyChanged de façon à prévenir le binding de la modification de la valeur.
Et dans chacun de tes bouton tu appelles Resume avec soit true, soit false.

public void Resume(bool Texte1)
{
     if(Texte1)//on construit le texte selon le bool
           sortie = "Texte 1";
     else
           sortie = "Pas texte 1";
    

     GenerePropertyChanged("MonTexteDeSortie");//on prévient le binding du changement
}


private string sortie="";

public string MonTexteDeSortie
{
      get {return sortie;}
}

Hamster18
Messages postés
26
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
21 mai 2019
-
Merci ! Ça fonctionne ! Merci beaucoup de votre aide !
Commenter la réponse de Whismeril
Messages postés
13301
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 mai 2019
341
0
Merci
De rien
Commenter la réponse de Whismeril