Bonjour,
j'ai un formulaire que je crée ds le code behind (selection de date, liste deroulante) je souhaiterais mettre une listbox avec des element selectionnable (multiple).
comment faire pour mettre cette listbox dans mon formulaire?
Version imprimable
Bonjour,
j'ai un formulaire que je crée ds le code behind (selection de date, liste deroulante) je souhaiterais mettre une listbox avec des element selectionnable (multiple).
comment faire pour mettre cette listbox dans mon formulaire?
Tu crées ta ListBox et tu l'ajoutes... Où est-ce que tu bloques ?
j'ai tester des listeboxfiltre.item.add; j'ai tester listeboxfiltre.itemssource=list<string> .... je n'arrive pas a visualiser ma listebox correctement.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public class Formulaire { [Display(Name = "Date début :", Description = "Saisir une date début: DD/MM/YYYY")] public DateTime DateDebut{ get; set; } [Display(Name = "Date fin :", Description = "Saisir une date de fin: DD/MM/YYYY")] public DateTime DateFin { get; set; } public ListBox listeboxfiltre { get; set; } public Formulaire(int year, int month, int day) { this.DateDebut = new DateTime(2010, 02, 01);//A SUP APRES TEST this.DateFin = new DateTime(2010, 02, 28); //A SUP APRES TEST } }
Hein ?
Une ListBox dans un business object ?
Est-ce que au moins tu ajoutes ta TextBox dans un containeur (Grid, StackPanel...) avant ?
alors en fait dans mon XAML de la page j'ai les balise formulaire.
ensuite au chargement de la page:
alors ça marche nikel pr les datetime et les liste déroulante. mais pas pr une listbox. (dnas le code , formulaire en minuscule represente le formulaire créé en xaml)Code:
1
2
3
4
5
6
7 //creation du formulaire DateTime today = DateTime.Now; int year = today.Year; int month = today.Month; int day = today.Day; Formulaire formulaire1 = new Formulaire(year, month, day); formulaire.CurrentItem = formulaire1;
Tu dois redéfinir le template de ton DataForm pour prendre en compte ta ListBox et binder son ItemsSource sur ta collection. Mais pour ça tu dois d'abord enlever ta ListBox de ta classe Formulaire et la remplacer par une List<T> représentant les éléments que tu souhaites voir apparaitre dans ta ListBox.
euh je n'ai pas tout compris.
comment et pourquoi redefinir le template (les listbox sont bien prise en compte si on les met coté xaml...)
je pensé que c'était lier à un mot clé spécial pour les listbox (comme typeterminal pour les liste déroulante :)Code:
1
2
3
4
5
6 public TypeTerminal tri { get; set; } public enum TypeTerminal { nom prenom }
C'est pas une histoire de mot clé. TypeTerminal c'est un enum et le DataForm sait que lorsqu'il est bindé sur une propriété de type enum il doit afficher un DropDown.
Pour ta ListBox je te dis que tu dois redéfinir le template pour la faire s'afficher.
Tu as l'air de tout mélanger : contrôles, binding, template, business object...
En effet je suis un peu perdu la (merci de ton aide d'aileurs).
je comprend pas ce qu'il y a a modifié reelmeent dans mon formulaire. en fait je comprend pas pkoi il faut aller toucher au template alors que de base il prend bien les listBox (formulaire créé précedement en xaml et les listbox fonctionnaient) et ensuite ba d'apres des tuto il falait créer une classe formulaire et creer un objet formulaire à entrer en paramatre du Formulaire du xaml.
Si tu expliquais ce que tu voulais faire et nous montrer ton code (C# et Xaml) déjà existant ça nous aiderait :ccool:
voici le code:Citation:
Si tu expliquais ce que tu voulais faire et nous montrer ton code (C# et Xaml) déjà existant ça nous aiderait
Mapage.xaml :Mapage.cs:Code:
1
2
3
4 <dataFormToolkit:DataForm Margin="0,5,0,0" DescriptionViewerPosition="Auto" x:Name="formulaire" CommitButtonContent="Valider" Header="Faites votre sélection" AutoCommit="True" AutoEdit="true" CommandButtonsVisibility="Commit" ValidatingItem="formulaire_ValidatingItem" HorizontalAlignment="Left" > </dataFormToolkit:DataForm>
Formulaire.cs:Code:
1
2
3
4
5
6 DateTime today = DateTime.Now; int year = today.Year; int month = today.Month; int day = today.Day; Formulaire formulaire1 = new Formulaire(year, month, day); formulaire.CurrentItem = formulaire1;
ceci fonctionnent bien.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public class Formulaire { [Display(Name = "Trier par :")] public TypeTerminal tri { get; set; } public enum TypeTerminal { Nom, Date } [Display(Name = "Date début :", Description = "Saisir une date début: DD/MM/YYYY")] public DateTime DateDebut { get; set; } [Display(Name = "Date fin :", Description = "Saisir une date de fin: DD/MM/YYYY")] public DateTime DateFin { get; set; } public FormulaireTri(int year, int month, int day) { this.DateDebut = new DateTime(year, month - 1, day); this.DateFin = new DateTime(year, month, day); } }
maintenan je souhaiterai simplement avoir une listbox multiselection en + dans mon formulaire afin d'avoir l'équivalent de ce qui marche quand on le cré en xaml (j'ai pas remis le detail des autres composant de mon formulaire) :
en esperant avoir été plus clairCode:
1
2
3 <dataFormToolkit:DataForm Margin="0,5,0,0" DescriptionViewerPosition="Auto" x:Name="formulaire" .... > <ListBox>****</ListBox> </dataFormToolkit:DataForm>
Et donc je te répète, il faut que tu modifies le template d'affichage de ton DataForm pour incorporer ta ListBox et la binder sur une propriété de ton objet Formulaire.
Pour le moment tout s'affiche correctement puisque tu as seulement des propriétés simples (un enum et 2 datetimes) donc le DataForm sait comment afficher ton objet. Or toi tu veux customiser cet affichage puisque tu veux ajouter une ListBox, donc tu dois modifier le Template de ton DataForm pour rajouter tous tes champs (y compris ta DropDown et ton Calendar pour tes DateTime).
et d'apres mon code tu pourrais mé préciser comment modifier ce fameux template ?
je suis un peu largué la... j'ai regarder ccomment modifier le template mais je vois pas la différence entre ça et tout mettre en dur. ce que je ne souhaite pas.
Tu peux tout trouver sur le net
Exemple ici : http://www.a2zdotnet.com/View.aspx?id=134
oui crois moi que j'ai tourner sur pas mal de site pour ça mais en vain...
je ne comprends pas trop l'interet d'un template ici. (utile quand on a la lecture, le edit, l'ajout pour précisé le binding à chaque fois) moi j'au simplement 2 champ date et une listebox, (pas de edit, pas d'ajout) donc si je suis cette vois la autant construire mon dataform dans le xaml et binder directement sur les variable... (cela dit je sais meme pas si c'st possible a tester, mais dans ce cas ce n'est plus créé dans le code behind.)
Tu veux qu'elle fasse quoi ta ListBox multi-selection ?
je rempli cette listbox avec des données récuperer par un service wcf, ensuite je selectionne ce que je veux et lorsque je valide le formulaire je récupère la liste des items que j'ai selectionné.
ma classe formulaire c'est pour créer un formulaire sans rien mettre dans le xaml (sauf la balise dataform bien sur)
la je créé un objet formulaire, je " l'injecte " dans mon formuliare du xaml et celui ci recupere les parametres de cet objet
(je n'ai pas pas les liens sous la main pour te montrer un exemple mais je pense que tu dois voir de quoi je parle)
Oui je comprends, mais quel est le lien entre ta ListBox et ta classe Formulaire ?
Est-ce que le fait de sélectionner tel ou tel chose dans la LIstBox modifie une propriété de ton objet Formulaire ?
bah apres quand je falide je me sert de formulaire.date, formulaire.filtre ....
la aujourd'hui il n'y a pas de vrai lien puisqeu j'ai mon formulaire qui marche mais du coup pour le moment j'ai fait une ListBox a part pour faire fonctionner mon application.
donc oui a la validation de mon fomulaire, (mon formulaire a pour le momen datetime DateDebut, datetime Datefin) ces parametres ont des valeurs que j'envoi a mes service wcf.
Je comprends rien.
Pourquoi tu ne mets pas une ListBox en dessous de ton DataForm ?
c'est une question d'ergonomie, selectionner un filtre dans la listebox pui ensuite alé cliquer sur le formulaire (parce que en + le bouton valider n'est pas directement cliquable avec silverlight faut d'abord cliquer sur le formulaire)
c'est pas très ergonomique. alors que si c'est ds le formulaire la c'est logique, on selectionne toute nos option dans le formulaire, et on valide.
donc on en reviens a que je comprend pas comment le modifier pr faire ce que je souhaite ^^
Dans le lien que je t'ai donné tout est expliqué.
Ce qui t'intéresse doit être le ReadOnlyTemplate.
Tu vas devoir le refaire pour incorporer ta DropDown, tes 2 DatePickers et ta ListBox.
bon bah dans mon xaml j'ai ajouté :
donc bah déjà j'ai perdu l'aspect générique puisque si je modifie mon objet formulaire, mon formulaire afficher ne sera pas impacté tant que je modifie pas dans le xaml....Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <dataFormToolkit:DataForm.EditTemplate> <DataTemplate> <StackPanel> <dataFormToolkit:DataField> <controls:DatePicker Text="{Binding DateDebut, Converter={StaticResource DateConverter}, Mode=TwoWay}" /> </dataFormToolkit:DataField> <dataFormToolkit:DataField> <controls:DatePicker Text="{Binding DateFin, Converter={StaticResource DateConverter}, Mode=TwoWay}" /> </dataFormToolkit:DataField> <dataFormToolkit:DataField> <ListBox x:Name="listeBoxDataForm" MaxHeight="150" SelectionMode="Multiple" ItemsSource="{Binding filtre, Mode=TwoWay}" /> </dataFormToolkit:DataField> </StackPanel> </DataTemplate> </dataFormToolkit:DataForm.EditTemplate>
sinon bah la au niveau de l'affichage ça marche.. cependant gros probleme.... lors de la validation je peux bien récuperer mes valeurs de date mais il n'est pas possible de recupérer les element selectionnée de la listbox... en effet je peux récuperer uniquement la liste de l'objet formulaire (donc tous les element d'un coup)
voila ce que j'ai tenté:
(les données sont bindées sur un objet de ma classe Formulaire qui contient 3 parametres : 2 Datetimes et 1 listbox.
ceci ne marchait pas puisque seul le 1er itemselectionné est récupéré, impossible de récupérer selectionneditemSCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <dataFormToolkit:DataForm.EditTemplate> <DataTemplate> <StackPanel> <dataFormToolkit:DataField> <controls:DatePicker Text="{Binding DateDebut, Converter={StaticResource DateConverter}, Mode=TwoWay}" /> </dataFormToolkit:DataField> <dataFormToolkit:DataField> <controls:DatePicker Text="{Binding DateFin, Converter={StaticResource DateConverter}, Mode=TwoWay}" /> </dataFormToolkit:DataField> <dataFormToolkit:DataField> <ListBox MaxHeight="150" SelectionMode="Multiple" SelectedItem="{Binding filtre.SelectedItem, Mode=TwoWay}" ItemsSource="{Binding filtre.ItemsSource, Mode=OneWay}" /> </dataFormToolkit:DataField> </StackPanel> </DataTemplate> </dataFormToolkit:DataForm.EditTemplate> </dataFormToolkit:DataForm>
donc le seul truc que j'ai pu faire et qui fonctionne :
ce code est entre les balise dataform mais plus dans un template
(Aussi, mon objet formulaire contient 2 datetime et 1 observablecollection)
cependant avec ceci, je ne fait plus Monformulaire.liste.selecteditems(qui ne fonctionnais pas) mais directement filtreformulaire.selecteditems.Code:
1
2
3
4
5
6
7
8
9
10
11
12 <StackPanel> <dataFormToolkit:DataField> <controls:DatePicker x:Name="datededebut" Text="{Binding DateDebut, Converter={StaticResource DateConverter}, Mode=TwoWay}" /> </dataFormToolkit:DataField> <dataFormToolkit:DataField> <controls:DatePicker Text="{Binding DateFin, Converter={StaticResource DateConverter}, Mode=TwoWay}" /> </dataFormToolkit:DataField> <dataFormToolkit:DataField> <ListBox x:Name="filtreFormulaire" MaxHeight="150" SelectionMode="Multiple" ItemsSource="{Binding filtre, Mode=OneWay}" /> </dataFormToolkit:DataField> </StackPanel>
donc ceci marche, le seul truc c'est que la liste est bindé pour sa création à un parametre de mon objet Formulaire (l' observablecollection) mais ensuite quand je veu utiliser les données ,je les utilise par la listbox et non plus par le formulaire
Avec MesItems une propriété de type IEnumerable<T> dans ta classe FormulaireCode:SelectedItems="{Binding MesItems, Mode=TwoWay}"
il n'est pas possible de mettre SelectedItems dans le xaml , en effet ceci est recupérable qu'apres et non a la création du formulaire.
et le probleme est donc dans l'autre sens je veux que les selecteditems du formulaire xaml se reporte au formulaire objet.
donc la 2eme solution de mon dernier post à l'air d'etre la seule, ne plus définir dans le template mais dans les field du dataform une listbox a part entiere et de faire mes traitement non pas a la listbox du formulaire, mé en appelant directement cette listbox.
Tu peux t'en sortir avec un Attached Property.
http://stackoverflow.com/questions/1...n-in-viewmodel
j'ai regardé ce qui se fesait sur le lien, en effet c'est peut-etre une solution (je ne l'ai pas tester dans mon cas) mais ça complique le code puisque des classe pour le selectionchanged doivent être créées afin de construire la liste des selecteditems. donc je pense que c'est compliquer pour la même choses en s'éloignant de la méthode de départ(creation dynamique du dataform)
même si la listbox dans le formulaire reste une listebox a part, cela me semble pas moins "propre" de faire comme ça je pense.
d'autant + que si j'ai une liste déroulante et que suivant l'item selectionnée j'ai pas la meme listbox en dessous, ça peut etre interessant de pouvoir remplir la listbox individuellement?! (je devrai faire de meme pour la création de ma liste déroulante afin d'avoir un evenement selection_changed?)
Pourquoi tu poses une question si tu ne veux pas suivre les conseils qu'on te donne ?
Et en plus de ça ton problème est mal exposé.
Pour ton histoire de ListBox remplie différemment selon la ComboBox non tu n'as pas besoin de SelectionChanged, tu peux très bien t'en sortir avec MVVM sans écrire une ligne dans le code-behind.
je pense que si je ne souhaiter pas suivre tes conseil je n'insisterais pas pour bien les comprendre ;)
après en effet je pense que mon problème initiale a mal été exposé et qu'il y a un problème de compréhension du coup.
le truc et que coté client je doit avoir le code le + simple et générique possible, celui ci doit etre adaptable sur une autre page avec le moins d'impact possible. pour des raison estetique et surtout ergonomique je voulais mettre cette listbox dans le formulaire, ma solution peut-etre simpliste pour toi qui maitrise surement + que moi silverlight répond au besoin, le seul truc et que ça me fesai bizar d'appeler directement la listbox et non pas un parametre contenu dans la listbox.
donc je demandé simplement s'il y avait une solution afin de continuer comme le l'avais fait au début : avoir une balise dataform vide ou dedan j'injecte un objet et mon dataform est créé automatiquement, de la tu m'a convaincu que ce n'était pas possibler et tu m'as parler des template, jai regarder mais j'ai dut adapté puisque c'est pas dans le template que j'ai mi ma listbox mais dans des datafield directement.
je n'utilise pas pour le moment mvvm (trop de notion d'un coup pr apréhender silverlight je l'ai fait par étape et donc pas vue encor mvvm, et le projet devant etre terminer dans un mois j'esper mias je ne sais pas si je le ferais, (c'est dommage paske ta solution m'aurai surement bien interessé!!! mais d'autres choses doivent etre developper (comme l'export d'un datagrid (paginé) en fichier excel, et sous silverlight 4 sa a l'air simple mais je suis avec la version 3 ou pour le moment je n'ai pas trouver de solution non plus, seulement une qui me créé un xml ou un csv (et non pas de xls) mais qui recupere uniquement la premiere page de mon datagrid...)Citation:
Pour ton histoire de ListBox remplie différemment selon la ComboBox non tu n'as pas besoin de SelectionChanged, tu peux très bien t'en sortir avec MVVM sans écrire une ligne dans le code-behind.
salut,
je reviens juste pour l'histoire de ma listbox, si je n'utilise pas mvvm (malgres pas mals de documentation je pense pas pouvoir le maitriser a temps) je peux la faire ac un selectionchanged (de ma dropdown)? ?
pour le reste , en relisant les post je me dit que si je t'ai plutot écouté puisque :
donc jusque la j'ai bien tout fait pariel (sauf que c'est pas vrmt ds le template mais mon code est :Citation:
Est-ce que au moins tu ajoutes ta TextBox dans un containeur (Grid, StackPanel...) avant ?
redéfinir le template de ton DataForm pour prendre en compte ta ListBox et binder son ItemsSource sur ta collection. Mais pour ça tu dois d'abord enlever ta ListBox de ta classe Formulaire et la remplacer par une List<T> représentant les éléments que tu souhaites voir apparaitre dans ta ListBox.
modifier le Template de ton DataForm pour rajouter tous tes champs (y compris ta DropDown et ton Calendar pour tes DateTime).
Tu vas devoir le refaire pour incorporer ta DropDown, tes 2 DatePickers et ta ListBox.
et donc pour recuperer les valeurs de ma listbox je fait formulairefiltre.selecteditems (je pense que c'est plus clair expliqué comme ça)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <dataFormToolkit:DataForm Margin="0,5,0,0" DescriptionViewerPosition="Auto" x:Name="formulaire" CommitButtonContent="Valider" Header="Faites votre sélection" AutoCommit="True" AutoEdit="true" CommandButtonsVisibility="Commit" ValidatingItem="formulaire_ValidatingItem" HorizontalAlignment="Left" > <StackPanel> <dataFormToolkit:DataField> <controls:DatePicker Text="{Binding DateDebut, Converter={StaticResource DateConverter}, Mode=TwoWay}" /> </dataFormToolkit:DataField> <dataFormToolkit:DataField> <controls:DatePicker Text="{Binding DateFin, Converter={StaticResource DateConverter}, Mode=TwoWay}" /> </dataFormToolkit:DataField> <dataFormToolkit:DataField> <ListBox x:Name="Formulairefiltre" MaxHeight="150" SelectionMode="Multiple" ItemsSource="{Binding filtre, Mode=OneWay}" /> </dataFormToolkit:DataField> </StackPanel> </dataFormToolkit:DataForm>
apres je n'ai pas incorporé l'exemple de ton lien attached property. je pense pas que se soit nécéssaire.
en tt cas détrompe toi mais tes réponses m'ont beaucoup servie (je pense pas m'étre trop égarer par ce que j'ai fait au final) et je te remercie vrmt pour tte tes réponses, tu as pris le tps de m'expliquer malgrès mes nombreuses incompréhension.