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 :

Question générale sur le Binding!


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Par défaut Question générale sur le Binding!
    Bonjour à tous,
    Débutant en WPF, je me pose pas de question quant à l'utilisation du binding et ses bonnes pratiques.
    J'aurais voulu savoir si ma façon de faire est la bonne.
    Prenons le cas d'un formuulaire pour ajouter une personne. On se situe dans un UserControl

    Pour les différentes listes j'ai tendance à déclarer une structure (struct) avec mes différentes List<T>.
    Dans le constructeur de mon UserControl je récupère mes différentes listes, j'instancis ma structure et je l'assigne au Datacontext.
    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
    17
    18
    19
     
    public partial class PersonAdd : System.Windows.Controls.UserControl
    {
    	public struct StructContext
    	{
    		public List<Sport> FullListSport { get; set; }
    		public List<Loisir> FullListLoisir { get; set; }
    	}
    	...
     
    	public PersonAdd()
    	{
    		InitializeComponent();
    		DataContext = new StructContext{
    			FullListSport = //Appel à ma BLL
    			FullListLoisir = //Appel à ma BLL
    		};
    	}
    }

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <ComboBox ItemsSource="{Binding Path=FullListSport, Mode=OneWay}" />

    Pour la personne que je veux créer deux cas peuvent se produire:
    1) La personne n'est utilisée que dans cet UC, je peux donc la rajouter à ma structure
    2) J'ai besoin de la binder à ma Windows où à un autre UC alors j'utilise les DependencyProperty

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public partial class PersonModel : System.Windows.Controls.UserControl
    {
    	public PersonModel NewPerson{
    		get{return (PersonModel) GetValue(NewPersonProperty);}
    		set {SetValue(NewPersonProperty, value);}
    	}
    	public DependencyProperty NewPersonProperty = DependencyProperty.Register("NewPerson",typeof(PersonModel),typeof(PersonModel), new PropertyMetadata(null))
    	.....
    }

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <TextBox Text="{Binding Path=NewPerson.Name, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"  />

    Voilà, j'aimerai savoir si c'est une bonne façon de faire ou s'il ya plus simple.
    Je trouve l'écriture du RelativeSource={RelativeSource AncestorType={x:Type UserControl}} un peu lourde.
    Par avance merci.

  2. #2
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Par défaut
    Salut
    Il n'y a rien de choquant dans ton écriture de binding.
    Si tu veux simplifier tu peux donner un Name (ex: myUCName) à ton UC et ecrir un binding de cette façon:

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <UserControl x:Name="myUCName" ...>
    ...
    <TextBox Text="{Binding Path=NewPerson.Name, ElelentName=myUCName}}"/>
    ...
    </UserControl>

    Par contre fais attention à l'utilisation de structures et de listes. Quand tu va modifier une propriété d'une structure ton interface ne va pas être modifiée automatiquement. Idem au lieu d'utiliser les listes il vaux mieux passer par des ObservableCollection<T>.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Par défaut
    A oui en donnant un nom je n'y avait pas pensé.
    C'est peu être mieux dans le sens où si j'ai des UC imbriqués, il ne sera pas perdu.

    Par contre fais attention à l'utilisation de structures et de listes. Quand tu va modifier une propriété d'une structure ton interface ne va pas être modifiée automatiquement. Idem au lieu d'utiliser les listes il vaux mieux passer par des ObservableCollection<T>.
    Si je mets dans des observaleCollection<T> à la place des List<T> dans la structure mon affichage sera mis à jour? Ce n'est pas gênant que je sois dans le DataContext?

    D'ailleurs j'ai une autre petite question.
    J'avais mis des List car les données des listes ne changent pas souvent.

  4. #4
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Par défaut
    Personnellement je préfère ne pas toucher au DataContext de objets et ceci pour plusieurs raisons. Dans le cas de développement en équipe ça devient très dur de comprendre pourquoi des bindings ne marchent pas si on ne sait pas qu'en interne le DC a changé. Mais on peut aussi faire des erreurs et ne plus comprendre sois même pourquoi ca ne marche pas. Par exemple si tu avais ton UserControl dont une propriété est bindée sur la proprieté Toto de mon ViewModel D:

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <Grid DataContext="Une source de données quelconque( je l’appellerai D)">
        <MonUserControl MaPropriete={Binding Toto}/>
    </Grid>

    Maintenant si on modifie le DataContext de UserControl (comme dans ton exemple dans la méthode AddPerson) on se retrouve avec le DC du MonUserControl changé et donc le binding sur la propriété Toto ne marche plus car Dans le DataContext on a plus la donnée D.

    Du coups personnellement je préféré exposer une propriété et éviter les erreurs de DataContext.

  5. #5
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Par défaut
    Oui effectivement si ta structure est chargée une fois et ne change plus après tu n'as pas besoin de créer une classe qui implémente INotifyPropertyChanged ni utiliser les ObservableCollections.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Par défaut
    Du coup plutôt que de mettre ma Structure dans le DataContext, il serait peut être alors plus intéréssant de l'exploser directement via un attribut de mon UC c'est ça?

Discussions similaires

  1. Question générales sur les IG en Java
    Par link182 dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 18/02/2006, 11h42
  2. [LDAP] Questions générales sur LDAP
    Par guiguisi dans le forum Autres SGBD
    Réponses: 5
    Dernier message: 25/05/2005, 10h05
  3. questions générales sur Java Web Start
    Par Shiryu44 dans le forum JWS
    Réponses: 12
    Dernier message: 11/04/2005, 15h33
  4. question générale sur les conteneurs
    Par tut dans le forum C++
    Réponses: 6
    Dernier message: 01/09/2004, 10h11
  5. Question générale sur les affectations ?
    Par Clemaster dans le forum C++
    Réponses: 5
    Dernier message: 09/08/2004, 17h03

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