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

C# Discussion :

Problème WPF / Entity Framework / Data Binding


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 7
    Par défaut Problème WPF / Entity Framework / Data Binding
    Bonjour,

    Je me trouve devant un petit soucis. Je développe actuellement un logiciel permettant de générer des menus (un produit par jour sur 4 jours, lundi, mardi, jeudi et vendredi). Dans mon interface, j'ai un affichage pour un mois, divisé en 5 semaines, ayant chacune 4 jours.

    Voilà un screen:


    Les données affichées proviennent d'une base de données SQL Server Compact, j'utilise Entity Framework. Voilà le code XAML d'une semaine:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <ItemsControl HorizontalAlignment="Stretch" Margin="0,0,0,0" Width="Auto" ItemsPanel="{DynamicResource ItemsPanelMenuSemaine}" x:Name="LVWMenuSemaine1" Background="#00F4B909" ItemsSource="{Binding MenuJour, Mode=OneWay}" Cursor="Hand" MouseUp="LVWMenuSemaine1_MouseUp">
    </ItemsControl>
    C'est donc un ItemControl tout bête auquel j'applique mon template pour afficher la date et les produits avec les Binding. Par code je récupère ce qu'il faut de la base et je modifie le DataContext de mon ItemControl pour qu'il reçoive un MenuSemaine qui contient des MenuJour.

    Code du template:
    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
    <DataTemplate DataType="{x:MenuJourNormal}" x:Name="DTTMenuJourNormal">
    	<Grid Margin="0,0,2,0">
    		<Border BorderThickness="2,2,2,2" BorderBrush="#FFDDDDDD" CornerRadius="0,0,0,0" Margin="4,4,2,4">
    			<StackPanel Orientation="Vertical" Width="Auto" Height="Auto" Background="#FFFAFAFA">
    				<DockPanel Width="Auto" Height="Auto" Background="#FFDDDDDD">
    					<Label MinWidth="50" x:Name="LBLJourSemaine" Width="Auto" Height="Auto" Content="{Binding jour.DayOfWeek, Mode=Default}" HorizontalAlignment="Stretch" Padding="5,0,5,2"/>
    					<Label MinWidth="50" x:Name="LBLNumeroJourSemaine" Width="Auto" Height="Auto" Content="{Binding jour.Day, Mode=Default}" HorizontalContentAlignment="Right" DockPanel.Dock="Right" Foreground="#FFFF0000" Padding="5,0,5,2"/>
    				</DockPanel>
    				<StackPanel Width="Auto" Height="Auto" Orientation="Vertical" HorizontalAlignment="Center">
    					<Label Content="Elementaire" Height="Auto" Padding="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="#FF666666"/>
    					<Label Content="{Binding ProduitsDuJour.ProduitElementaire.nom, Mode=Default}" x:Name="LBLProduitElementaire" Width="Auto" Height="Auto" Padding="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
    				</StackPanel>
    				<StackPanel Width="Auto" Height="Auto" Orientation="Vertical" HorizontalAlignment="Center">
    					<Label Content="Maternelle" Height="Auto" Padding="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="#FF666666"/>
    					<Label Content="{Binding ProduitsDuJour.ProduitMaternelle.nom, Mode=Default}" x:Name="LBLProduitMaternelle" Width="Auto" Height="Auto" Padding="0,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
    				</StackPanel>
    			</StackPanel>
    		</Border>
    	</Grid>
    </DataTemplate>
    J'utilise donc un template pour le type MenuJourNormal dans le code ci-dessus (j'en ai 3 autres, pour les jours fériés, de vacances et vide). Ces derniers héritent tous de MenuJour.

    Ca c'était pour la présentation, maintenant voilà mon problème:
    Lorsque je clique sur l'une des semaines, je voudrais l'afficher en "grand" (via un second ItemsControl récupérant la semaine sur laquelle on a cliqué) mais avec une particularité: pouvoir modifier le produit via une ComboBox répertoriant tout les produits disponibles dans la base de données. Et que celui-ci soit ensuite modifié dans la semaine correspondante en base.

    Mon soucis et que je n'arrive pas a accéder au DataTemplate par code, et il semblerait, d'après ce que j'ai lu, qu'un DataTemplate n'est pas modifiable... J'aimerais rester au maximum côté XAML et ne pas devoir me taper ça en C#, ça limiterait l'intérêt de Blend et du WPF...

    J'ai pensé a plusieurs solutions mais je n'en ai pas trouvé qui me convienne, si je mets ma seconde liste avec un ItemTemplate différent, il s'applique a tout les MenuJour hors je ne veux modifier que les MenuJourNormal...
    De plus je ne sais pas comment faire pour faire un Binding vers mes entités a l'intérieur d'un DataTemplate et sans aucune ligne de code derrière (ne sachant pas accéder a cette dernière en C# et ne sachant pas si celle-ci est modifiable).

    Dernière précision, le MenuSemaine que je bind sur ma liste et qui affiche les MenuJour contenus a l'intérieur ne contient évidemment pas la liste de tout les produits de la base...

    Voilà, j'ai essayé d'être le plus clair possible mais bon, ce n'est pas évident donc si il y a des questions...

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Cheinz Voir le message
    J'ai pensé a plusieurs solutions mais je n'en ai pas trouvé qui me convienne, si je mets ma seconde liste avec un ItemTemplate différent, il s'applique a tout les MenuJour hors je ne veux modifier que les MenuJourNormal...
    Il y a 2 principales approches possibles :

    - La plus simple est de définir les 3 DataTemplates dans les ressources du ItemsControl, en précisant seulement le DataType (pas le x:Key). WPF prendra automatiquement le DataTemplate correspondant au type de l'élément à afficher

    - Tu peux aussi utiliser un DataTemplateSelector (que tu affectes à la propriété ItemTemplateSelector du ItemsControl) : c'est juste un objet avec une méthode qui prend en paramètre un objet et renvoie un DataTemplate. Pour accéder au template défini en ressources, utilise la méthode FindResource (sur l'objet Application ou sur la fenêtre où le contrôle où le template est défini)

    Si tu ne connais pas, je te conseille de jeter un oeil au pattern MVVM, ça te permettra d'avoir une architecture beaucoup plus claire, et les solutions à ce genre de problème te sembleront beaucoup plus évidentes... Il y a un tuto à ce sujet sur DVP. Si tu lis l'anglais, je te conseille aussi l'article de Josh Smith, un des "pères" de ce pattern.

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 7
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Il y a 2 principales approches possibles :

    - La plus simple est de définir les 3 DataTemplates dans les ressources du ItemsControl, en précisant seulement le DataType (pas le x:Key). WPF prendra automatiquement le DataTemplate correspondant au type de l'élément à afficher

    - Tu peux aussi utiliser un DataTemplateSelector (que tu affectes à la propriété ItemTemplateSelector du ItemsControl) : c'est juste un objet avec une méthode qui prend en paramètre un objet et renvoie un DataTemplate. Pour accéder au template défini en ressources, utilise la méthode FindResource (sur l'objet Application ou sur la fenêtre où le contrôle où le template est défini)

    Si tu ne connais pas, je te conseille de jeter un oeil au pattern MVVM, ça te permettra d'avoir une architecture beaucoup plus claire, et les solutions à ce genre de problème te sembleront beaucoup plus évidentes... Il y a un tuto à ce sujet sur DVP. Si tu lis l'anglais, je te conseille aussi l'article de Josh Smith, un des "pères" de ce pattern.
    Merci pour ta réponse tomlev.

    Concernant les DataTemplate associées a un DataType particulier, c'est ce que j'utilise actuellement, j'ai mis mon exemple pour le type MenuJourNormal mais j'ai aussi MenuJourFerie et MenuJourVide (n'affiche rien), et aussi MenuJour tout court qui est ma classe mère, les autres en héritant. Il faut que je rajoutes MenuJourVacance aussi. Chacun de ces types a son propre template.

    Et c'est justement ça qui m'embêtes car, je suis au final obligé d'envoyer un MenuSemaine, qui contiendra des MenuJour (qui seront d'un des types cités au dessus) sauf que je voudrais changer le template uniquement quand je suis "en modification" et uniquement pour les MenuJourNormal, les autres devant rester comme ils sont...

    Pour la deuxième partie, je vais regarder ça.

    Ce que j'ai fais hier, c'est ajouter a ma classe MenuJourNormal un attribut listeProduits contenant la liste des produits, je peux donc afficher ma ComboBox avec la liste cependant il faut qu'elle soit cachée dans l'affichage "mois" et active dans l'affichage "semaine" et ça je ne sais pas faire ^^. Je ne sais pas non plus comment synchroniser ce Combo pour qu'il prenne par défaut la valeur du label correspondant dans mon MenuJourNormal mais bon ça ce n'est pas dramatique.

    Niveau conception je ne suis pas sur non plus que ce soit très bon... la théorie voudrait que la liste des produits n'est pas grand chose a faire dans un menu journalier...

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 7
    Par défaut
    J'ai lu le guide sur le modèle MVVM, effectivement c'est pas mal, je pense que je vais reprendre une partie de mon application pour le suivre malheureusement pour le cas précis ou je coince... je ne suis pas sur que ça puisse énormément m'aider (mais ça simplifierait certaines choses ailleurs par contre).

    Enfin je vais commencer a modifier un peu tout ça pour voir si une solution me vient a l'esprit par la même occasion (en provoquant un "mais c'est bien sur, je suis trop c*n" ^^).

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/01/2013, 13h18
  2. Problème datetime2 entity framework
    Par france38 dans le forum Entity Framework
    Réponses: 18
    Dernier message: 04/07/2011, 12h21
  3. Réponses: 2
    Dernier message: 01/03/2010, 21h32
  4. Pertes de binding via Entity Framework + WPF +WCF
    Par GTSLASH dans le forum Services Web
    Réponses: 4
    Dernier message: 12/08/2009, 10h17
  5. WCF, Entity Framework et problème de chaîne de connexion
    Par mike1808 dans le forum Windows Communication Foundation
    Réponses: 1
    Dernier message: 10/10/2008, 09h34

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