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 :

Binding à partir de classes différentes


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Points : 44
    Points
    44
    Par défaut Binding à partir de classes différentes
    Bonjour,

    J'ai une liste d'objets qui sont des instances de classes de types différents…

    Ces classes possèdent uniquement des propriétés.

    Exemple :

    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
     
    public class Class1
    {
                private Int32 attribut1;
                private Int16 attribut2;
     
                public Int32 Attribut1
                {
                            get { return attribut1; }
                            set { attribut1 = value; }
                }
     
                public Int16 Attribut2
                {
                            get { return attribut2; }
                            set { attribut2 = value; }
                }
    }
     
    public class Class2
    {
                private Int32 Entier3;
     
                public Int32 Entier3
                {
                            get { return Entier3; }
                            set { Entier3= value; }
                }
    }
    Ces instances (instClasse1 de Classe1 et instClasse2 de Classe2) sont listées dans un TreeView disposé à gauche de mon IHM.

    Dans la partie droite de mon IHM, j'ai un ListView avec deux colonnes ("Nom" et "Valeur").

    Mon but est d'afficher, lorsque je clique sur un Item de mon TreeView (donc sur instClasse1 ou instClasse2), les propriétés (Nom et Valeur) de cette instance dans la ListView.

    J'aimerais effectuer ceci par Binding. Or comme ces instances ne sont pas de la même classe, je ne peux effecteur un Binding "classique" comme vu dans les nombreux exemples…

    Cela est il faisable ? En utilisant peut être des Converter ? De quelle façon ?

    Merci de m'éclairer.

    N'hésitez pas à me poser des questions supplémentaires si mon explication ne vous paraît pas assez claire…

    Pascal

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    C'est la 2me question où je comprend rien à ce qu'on demande

    C'est moi qui suis fatigué ou y'a un truc ?

  3. #3
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Sinon en envisageant la conception un peu différemment...

    Tu crées une classe Base qui a pour propriété Nom et Valeur (et toutes les propriétés communes à tes classes Classe1 et Classe2).
    Ces classes Classe1 et Classe2 héritent alors de Base et contiennent toutes les propriétés qui leurs sont propres

    Et le treeView lui contient des objets Base donc une seule classe .

  4. #4
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Essaie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ListView ItemsSource="{Binding}">
    	<ListView.View>
    		<GridView>
    			<GridViewColumn Header="Nom" DisplayMemberBinding="{Binding Path=Name}" />
    			<GridViewColumn Header="Valeur" DisplayMemberBinding="{Binding Path=Value}" />
    		</GridView>
    	</ListView.View>
    </ListView>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public partial class Window1 : Window
    {
    	public Window1()
    	{
    		InitializeComponent();
     
    		var c = new { Attribut1 = 23, Attribut2 = 644 };
    		DataContext = from pi in c.GetType().GetProperties()
    					  select new { Name = pi.Name, Value = pi.GetValue(c, null) };
    	}
    }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Points : 44
    Points
    44
    Par défaut Merci pour vos solutions mais
    Je ne comprends pas le code de la ligne suivante :

    var c = new { Attribut1 = 23, Attribut2 = 644 };
    DataContext = from pi in c.GetType().GetProperties()
    select new { Name = pi.Name, Value = pi.GetValue(c, null) };
    Pascal

  6. #6
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    C'est du C# 3: cela fait appel à l'inférence de type, aux types anonymes, aux requêtes LINQ et à la reflexion (introspection en français)....

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Points : 44
    Points
    44
    Par défaut
    Re,

    La réflexion, je connais... Mais c'est ce var, ce from et ce select qui m'ont surpris... Mais j'ai compris le principe et cela marche.

    C'est nickel...

    Y'a plus qu'à essayer de rendre ma ListView éditable pour pouvoir non seulement lister mes propriétés mais aussi les modifier...

    Merci beaucoup à vous tous !

    Pascal

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Points : 44
    Points
    44
    Par défaut
    Oulàlà je pensais que éditer une ListView était assez simple, mais j'ai l'impression qu'il faut utiliser des Adorner j'sais pas koi...

    Est ce bien la bonne démarche ou existe t'il d'autres solutions ?

    Je rappelle : mon besoin est de modifier le contenu d'une ListView sachant que cette ListView affiche des propriétés d'instance de classe (Cf. début du POST).

    Merci.

    Pascal

  9. #9
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut


    Pas besoin de forcément utiliser des Adorners dans ton cas....

  10. #10
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <ListView ItemsSource="{Binding}">
    	<ListView.View>
    		<GridView>
    			<GridViewColumn Header="Nom" DisplayMemberBinding="{Binding Path=Name}" />
    			<GridViewColumn Header="Valeur">
    				<GridViewColumn.CellTemplate>
    					<DataTemplate>
    						<TextBox Text="{Binding Path=Value}" />
    					</DataTemplate>
    				</GridViewColumn.CellTemplate>
    			</GridViewColumn>
    		</GridView>
    	</ListView.View>
    </ListView>
    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
    public partial class Window1 : Window
    {
    	public Window1()
    	{
    		InitializeComponent();
     
    		var c = new { Attribut1 = 23, Attribut2 = 644 };
    		DataContext = from pi in c.GetType().GetProperties()
    					  select new Property(pi, c);
    	}
    }
     
    public class Property
    {
    	private PropertyInfo _pi;
    	private object _obj;
     
    	public Property(PropertyInfo pi, object obj)
    	{
    		_pi = pi;
    		_obj = obj;
    	}
    	public string Name { get { return _pi.Name; } }
    	public object Value { get { return _pi.GetValue(_obj, null); } set { _pi.SetValue(_obj, value, null); } }
    }

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Points : 44
    Points
    44
    Par défaut
    Merci je teste cela cela tout à l'heure.

    Sympa les gars !

    Pascal

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Points : 44
    Points
    44
    Par défaut
    Merci encore mais il y'aurait un petit bug...

    J'ai mis un try catch autour du SetValue du set de la Propriété Value :

    set { _pi.SetValue(_obj, value, null); }

    et je récupère l'erreur suivante :

    Argument Exception was caught :
    Méthode property-set introuvable.

    D'autre part, comment rajouter des évènement sur ma DataTemplate TextBox pour pouvoir par exemple récupérer une touche Entrée appuiyée pour valider la modification de la cellule ?

    Merci beaucoup.

    Pascal

  13. #13
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Citation Envoyé par pcayrol
    D'autre part, comment rajouter des évènement sur ma DataTemplate TextBox pour pouvoir par exemple récupérer une touche Entrée appuiyée pour valider la modification de la cellule ?
    Dans ton DataTemplate, tu dois pouvoir faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox Text="{Binding Path=Value}" KeyDown="TboxKeyDownEvent" />

  14. #14
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par binoo Voir le message
    Dans ton DataTemplate, tu dois pouvoir faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox Text="{Binding Path=Value}" KeyDown="TboxKeyDownEvent" />
    Oui: cela marche en effet dans les ControlTemplate mais aussi dans les DataTemplates

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Points : 44
    Points
    44
    Par défaut Mise à jour...
    Re tout le monde,

    Mon IHM marche nickel et affiche donc les instances de classes de type différent
    et ce grâce à un magnifique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    instance = ((TreeViewItem)treeView.SelectedItem).Tag;
    DataContext = from pi in moninstance.GetType().GetProperties()
              select new Property(pi, moninstance);
    (Cf. messages précédents...)

    appelé chaque fois que je clique sur un item de ma TreeView.

    Petite question :

    Mes instances peuvent être modifié lors de l'exécution du programme, je veux donc voir mon IHM refléter ces instances en temps-réel (ou rafraichi périodiquement toutes les 3 secondes par exemple...) :

    Pour cela, j'ai crée un Timer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private Timer timerMiseAJourIHM;
    que j'active dans mon constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                timerMiseAJourIHM = new Timer();
     
                timerMiseAJourIHM.Elapsed += new ElapsedEventHandler(timerMiseAJourIHM_Elapsed);
     
                //  toutes les 3 secondes par exemple
                timerMiseAJourIHM.Interval = 3000;
                timerMiseAJourIHM.Enabled = true;
    Je vous passe les difficultés que j'ai eu pour pouvoir modifier mon TreeView à parti de mon objet timerMiseAJourIHM (utilisation d'un delegate et d'un Dispatcher.BeginInvoke)...

    Enfin toujours est il que toutes les 3 secondes, je veux mettre à jour mon affichage. Le code suivant fonctionne mais cela est il propre ? Existe il une meilleure solution ?
    Disons comment mettre à jour un objet DataContext ? Je ne comprends pas en fait très bien le rôle/type de cette variable...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    instance = ((TreeViewItem)treeView.SelectedItem).Tag;
     
    DataContext = from pi in instance .GetType().GetProperties()
              select new Property(pi, instance);

  16. #16
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par pcayrol Voir le message
    Pour cela, j'ai crée un Timer :
    Un DispatcherTimer, c'est mieux

    Disons comment mettre à jour un objet DataContext ? Je ne comprends pas en fait très bien le rôle/type de cette variable...
    Le DC, c'est un peu la source des données de ton application si tu veux. Pour la mettre à jour, il suffit de re-spécifier sa valeur

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Points : 44
    Points
    44
    Par défaut
    Re,



    Quels sont tes arguments en faveur du TimeDispatcher ?




    Pour ce qui concerne le objet DataContext, je croyais que le fait de Binder m'affranchissez de ces mises à jour...

    Enfin mon Binding n'est pas un Binding classique...

    Merci.

    Pascal

  18. #18
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Quant tu utilises un Timer classique, il s'exécute dans un Thread différent de l'interface graphique. Du coup, si tu veux accéder à ton IHM, il faut passer par des délégués, Invoke/BeginInvoke, etc...

    Avec le DispatcherTimer, ton thread s'exécute dans le même thread que celui de l'interface du coup, tu peux accéder "normalement" aux contrôles


    En ce qui conerne ton DC, si tu veux qu'il se mette à jour automatiquement toutes les 3 secondes, ca va pas de faire tout seul: comment veux-tu qu'il sache que c'est une MAJ qu'il doit faire, toutes les 3 secondes, et pas une connexion à une BDD ou un autre truc ?
    Le binding fait beaucoup de choses mais ne fait pas tout pour toi...

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Points : 44
    Points
    44
    Par défaut
    Merci beaucoup Thomas...

    Je vais tester ce DispatcherTimer demain !

    Pascal

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 89
    Points : 44
    Points
    44
    Par défaut
    Çà marche nickel.

    Merci encore.

    Pascal

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Génération de tables à partir des classes
    Par bbo1991 dans le forum Rational
    Réponses: 6
    Dernier message: 02/03/2007, 12h10
  2. [CSS] background-image et classes différentes
    Par Istrella dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 15/09/2006, 18h44
  3. Generer les .hbm a partir des classes
    Par you98 dans le forum Hibernate
    Réponses: 1
    Dernier message: 28/08/2006, 17h44
  4. [C#] Modifier mes Forms a partir de Class
    Par folk dans le forum Windows Forms
    Réponses: 12
    Dernier message: 01/08/2006, 17h54
  5. Réponses: 4
    Dernier message: 07/06/2004, 13h34

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