Bonjour,
Après plusieurs jours de galère et de recherche sur le net, je n'arrive pas à trouver une solution fonctionnelle pour le problème suivant.
Je cherche à faire des UserControl pour simplifier mon design de fenetres WPF.
Soit la classe simplifiée suivante (les classes réelles contiennent bcp plus d'attributs) :
Code C# : 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 public class Joueur { private String _nom; private String _prenom; public String Nom{ get { return _nom; } set { _nom = value;} } public String Prenom{ get { return _nom; } set { _prenom = value;} } public Joueur (){} }
Je crée un UserControl WPF (sous Visual Studio 2010 : Projet -> Ajouter un Controle Utilisateur), contenant une :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 //!\\ pseudo code : public partial class UserControlJoueur : UserControl { TextBox textBoxNom; // présent en fait dans le UserControlJoueur .xaml TextBox textBoxPrenom; }
Ensuite, je veux créer une fenetre et y glisser mon UserControlJoueur.
Je souhaite faire un DataBinding entre mon UserControlJoueur et une instance de la classe Joueur.
Dans ma fenetre AjouterJoueur, j'ai tenté un truc du genre :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public partial class FenetreAjoutJoueur : Window { public Joueur joueur_a_Ajouter { get; set; } public FenetreAjoutJoueur () { this.ShowActivated = true; joueur_a_Ajouter = new Joueur(); UserControlJoueur .DataContext = joueur_a_Ajouter; InitializeComponent(); } }
Mais ça ne fonctionne pas ...
J'ai bien cherché sur le net, mais je ne sais pas comment faire comprendre à mon UserControlJoueur :
- qu'il doit forcément être "bindé" avec une instance de la classe Joueur,
- que UserControlJoueur.textBoxNom.Text doit etre bindé avec l'attribut Joueur.Nom (et respectivement textBoxPrenom.Text avec Joueur.Prenom).
Ma seule piste potable est le lien suivant :
http://msdn.microsoft.com/fr-fr/library/5554bf3a.aspx
Mais il faut gérer ça, que je ne comprends pas bien :
Au pire, vais essayer d'utiliser mes classes(entités) comme source de données.DefaultBindingPropertyAttribute
Implémentez cet attribut sur des contrôles simple qui affichent une colonne (ou propriété) unique de données, tels que TextBox.
ComplexBindingPropertiesAttribute
Implémentez cet attribut sur des contrôles qui affichent des listes (ou des tables) de données, tels que DataGridView.
LookupBindingPropertiesAttribute
Implémentez cet attribut sur des contrôles qui affichent des listes (ou des tables) de données, mais doivent également présenter une colonne ou une propriété unique, tels que ComboBox.
Avec cette possibilité, on peut glisser directement une classe-entité sur le designer WPF selon certains templates prédéfinis. Je ne sais pas encore comment le faire avec un UserControl personnalisé.
Par ailleurs, l'utilisation de source de données à partir de mes classes est énervant, car lorsqu'on glisse une entité sur le designer, les champs sont désordonnés :'( (Champ prénom tout en haut, puis champ sexe, puis champ adresse, puis champ Nom etc... :/)
Quelqu'un a-t-il déjà été confronté à ce type de considérations, et quelle solution est la plus viable ?
Mon but est non seulement de pouvoir avoir une implémentation qui marche, mais de comprendre comment elle marche et pourquoi ^^ cerise sur le gateau, ce serait de savoir la différence avec d'autres méthodes.
Quelques liens que j'ai consultés :
- http://www.tech-archive.net/Archive/.../msg02767.html (databinding mais en WindowsForms, je ne comprends pas vraiment l'intéret de redéclarer les champs de la classe a binder et de lier les getters/setters avec les textbox ....)
- http://msdn.microsoft.com/en-us/libr...v=VS.100).aspx Crosoft propose un truc genre :
mais ça explique la façon de lier un UserControl à un champ de DataSource ...
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 [System.ComponentModel.DefaultBindingProperty("PhoneNumber")] public partial class PhoneNumberBox : UserControl { public string PhoneNumber { get{ return maskedTextBox1.Text; } set{ maskedTextBox1.Text = value; } } public PhoneNumberBox() { InitializeComponent(); } }
(je ne saisis pas comment lier plusieurs champs entre eux et forcer la cascade joueur <-> usercontroljoueur et usercontrol.textboxNom <-> joueur.Nom)- J'ai vu des tutos indiquant qu'il fallait probablement implémenter l'interface
dans la classe Joueur, mais je ne vois pas comment m'en servir dans le UserControlJoueur, et ne suis pas sur de comprendre l'implémentation de l'interface.
Code : Sélectionner tout - Visualiser dans une fenêtre à part INotifyPropertyChanged
PS :
Le contexte général est que je fais une application qui "grosso merdo" permet de consulter une base de données en local (un genre de console admin) et de faire des manips dessus.
J'ai voulu utiliser l'ADO.NET entity generator, mais me suis cassé les dents car je n'ai pas réussi à implémenter des fonctions de filtrage sur mes datagrids /viewsource représentant mes tables. POurtant j'arrive à mettre à jour et ajouter des éléments et impacter ces changements dans ma BDD MySQL ^^
Partager