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 :

WPF et databinding : Best practice ?


Sujet :

Windows Presentation Foundation

Vue hybride

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 6
    Par défaut WPF et databinding : Best practice ?
    Bonjours tout le monde !

    J'aurais besoin de conseils. Je commence à peine a utiliser wpf et j'ai découvert ce matin les magies du data binding. En gros, j'aimerais m'en servir dans une petit application que je fais pour mon travail. Mais j'aurais besoin de vos conseils pour savoir ce qui se fait, ce qui ne se fait pas et ce qu'il est mieux de ne pas faire

    En résumé, je créer une petit application Torrent pour distribuer a l'interne des fichiers volumineux. Je programme en c# et j'utilise Visual Studio 2008.

    Mon application Client contient 3 projets distincs : KClient, Client et ClientGUI .

    KClient est une petit classe qui me permet, grâce a une libraire apellé MonoTorrent, de distribuer, créer, downloader et seeder des torrents. C'est a ce niveau que j'ai des objets de type MonoTorrent.TorrentManager qui me donnes les informations sur les torrents en cours.

    Client est une classe qui controle un objet KClient et lui dit quel torrent télécharger, seeder, recoit les ordres du serveur, etc.

    ClientGUI est simplement l'interface graphique qui instancie un objet Client et devrait afficher les informations sur les torrents en cours.

    J'aurais vraiment aimé utiliser le data binding pour faire afficher les informations fournis par le MonoTorrent.TorrentManager sans avoir a mettre de timer et de rafraichir mes données a tout bout de champ. Le problème, c'est que je ne trouve pas très "joli" d'ajouter dans Client et ClientGUI des références a MonoTorrent afin qu'ils reconnaissent la classe TorrentManager pour afficher finalement les données...

    Bref, si je résume :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class KClient{ new TorrentManager() }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class Client{ new KClient()...}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class ClientGUI { new Client()...}
    Et je voudrais trouver un moyen de binder les informatins du TorrentManager dans une ListView en wpf dans la class ClientGUI.

    J'espère que je suis pas trop floue dans mes explications...

    Si quelqu'un a des conseils ou des suggestions, ça me ferais plaisir de les entendre

    Merci beaucoup, bonne journée !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Par défaut
    Tu dois certainement avoir une classe du modèle qui va contenir les informations de monoTorrent.

    Pour cette même classe du modèle tu auras des accesseurs sur les informations que tu veux afficher.

    Cette classe doit donc implémenter l'interface INotifyPropertyChanged. Du coup à chaque fois qu'une info va être mise à jour, tu vas lancer l'event PropertyChanged.

    Maintenant dans ton xaml tu devras modifier les propriétés de mise à jour des données comme ça

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <TextBox Text={Binding PropertyName, UpdateSourceTrigger=PropertyChanged} />

    Le binding se mettra à jour automatiquement

    -------------------

    J'avais pas vu pour la ListView

    Pour ça c'est presque pareille. Tu n'as qu'à utiliser une ObservableCollection qui quand tu vas lui ajouter un object va mettre à jour le contenu de la ListView. Bien sûr, cette ObservableCollection devra être passée au Binding de la ListView.

    D'ailleurs une ObservableCollection est juste une collection qui a implémenté l'interface INotifyCollectionChanged

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Je te conseille de lire les articles sur le pattern M-V-VM, c'est un pattern pour organiser son application et qui répond justement à tes problèmatiques.

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    D'ailleurs une ObservableCollection est juste une collection qui a implémenté l'interface INotifyPropertyChanged
    Le comportement de notification lors d'ajout ou suppression d'éléments est imposé par INotifyCollectionChanged et pas INotifyPropertyChanged.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Par défaut
    Oui je me suis mélangé les pinceaux, je corrige de suite

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut
    Comme dit précédemment, pour que ton IHM se rafraichisse toute seule il faut qu'elle soit prévenue (via l'implémentation de INotifyPropertyChanged)
    Ce qu'il faudrait c'est que tu implémentes une classe qui va définir ton modèle. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Item : INotifyPropertyChanged
    {
      public string FileName
      {
        get { return _fileName; }
        set 
        {
          _fileName = value;
          RaiseNotifyPropertyChanged("FileName");
        }
    [...]
    }
    Ta classe KClient instancie un Item, s'abonne à l'évènement TorrentStateChanged du monotorrent et remplit les valeurs de Item à chaque déclenchement de l'évènement.
    Ta classe Client retourne tout simplement la liste d'objets Item fournis par KClient.
    Ta classe ClientGUI stocke les Item dans une collection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      public ReadOnlyObservableCollection<Item> Items { get; private set; };
     
    public ClientGUI()
    {
      Items = new ReadOnlyObservableCollection<Item>(client.GetItems());
    }
    Ton XAML se binde sur la ReadOnlyObservableCollection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <TextBlock  Text="{Binding Items.FileName}" />

Discussions similaires

  1. Réponses: 11
    Dernier message: 16/06/2006, 13h46
  2. swing best practices.
    Par bbclone dans le forum AWT/Swing
    Réponses: 13
    Dernier message: 07/06/2006, 10h14
  3. Réponses: 4
    Dernier message: 23/05/2006, 14h22

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