Associé du text et un élement Bindind dans un texrbox
Résolu
Hamster18
Messages postés
176
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
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.
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
A voir également:
- Associé du text et un élement Bindind dans un texrbox
- Sms to text - Télécharger - Sauvegarde
- Impossible de copier car cet élément est trop volumineux pour le format du volume - Forum MacOS
- Mettre un texte en majuscule - Guide
- Sélectionner du texte dans un pdf - Guide
- Element introuvable vérifiez son emplacement actuel et réessayez - Guide
7 réponses
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
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
176
Date d'inscription
Statut
Membre
Dernière intervention
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
Alors le plus simple est de créer une propriété dédiée dans la classe bindée.
Par exemple cette classe
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
et le xaml
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.
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.
Bonsoir
sans ton code, le contenu de la variable et le texte exact de l'erreur, j'en ai pas la moindre idée.
sans ton code, le contenu de la variable et le texte exact de l'erreur, j'en ai pas la moindre idée.
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 :
La classe Serie :
et mon code XAML :
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); } } }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question, 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/
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.
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.
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.
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;} }