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 :

Binding et Remoting


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 31
    Par défaut Binding et Remoting
    Bonjour,

    Je ne parviens pas à réaliser le Binding avec un objet remoting.

    MonObjet obj est MarshallByRef, j'ai donc dans mon client un proxy sur mon objet activé coté client.

    Si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Windows.MessageBox.Show(obj.ID.ToString());
    j'obtiens bien l'identifiant de l'objet, c'est la preuve qu'il est bien instancié et qu'il contient les données.

    En revanche, le binding suivant ne marche que partiellement: (Le contexte est bien défini à obj)

    En xaml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Label Content="{Binding}"/>
    <Label Content="{Binding Path=ID}"/>
    m'affiche bien MonNamespace.MonObjet dans le premier label soit obj.ToString(), mais rien du tout dans le second: il n'arrive pas à accéder à la propriété.

    Je précise que mon objet implémente l'interface IMonObjet, qui est connue du client et qui précise que l'objet à une propriété ID. Donc cela ne vient pas du fait que le client ne connaisse pas cette propriété.

    Je n'arrive pas à binder les propriétés. Quelqu'un a une idée ?

  2. #2
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 31
    Par défaut Je progresse...
    J'ai enfin réussi à réaliser une partie de mon binding.

    Cependant, je bute encore sur un problème:

    Je peux binder les propriétés qui sont définies dans mon interface.
    Tous mes objets implémentent l'interface IMonObjet, qui s'écrit comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public interface IMonObjet
    {
            int ID { get; }
            object this[string key] { get; set; }
    }
    L'indexeur devrait me permettre d'accéder à toutes les proprités de mes différents objet.

    Dans mon client, j'ai ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IMonObjet = obj = Remote.GetMonObject();
    obj est donc un proxy remote, qui contient bien les données.

    Or, le binding ne marche pas avec l'indexeur et l'objet remoting. Cependant, dès que le client a connaissance de la classe MonObjet (via une simple référence ajouté au projet), cela fonctionne, même si je binde un IMonObjet.

    Une piste serait-elle de définir un Binding.Converter ?
    Quelqu'un aurait-il une idée ?

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Par défaut
    Foi dzaille! Ca m'a l'air bien compliquer ton affaire.
    En fait, t'arrive pas à récupéré l'id de ton objet si je comprend bien.
    Mais question bête, ton objet est bien du type de ton interface? en gros, l'interface est présente coté serveur et coté client?

  4. #4
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 31
    Par défaut
    Oui, l'interface est implémentée par l'objet, et est connue à la fois par le client et le serveur.

    Le client, evidemment, ne connais que l'interface.

    Dans le client, j'arrive à trouver l'ID, qui est défini dans l'interface par une propriété.

    En revanche, je n'arrive pas à utiliser l'indexeur, c'est à dire à faire un binding de la sorte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Binding Path=ID // Fonctionne
    Binding Path=[ID] // Ne fonctionne pas.
    De plus, si je modifie ma structure de la sorte:

    interface IMonObjet implémentée par MonObjetBase:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class MonObjetBase : MarshallByRef, IMonObjetBase
    MonObjetBase est connu à la fois de mon serveur et de mon client.

    Tous les composants dérivent ensuite de MonObjetbase:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public class MonObjet1 : IMonObjetbase {...}
    public class MonObjet2 : IMonObjetbase {...}
    Que tout soit bien clair: le client ne connais que IMonObjet et l'implementation de base: MonObjetBase.

    L'indexeur est défini dans MonObjetBase, qui utilise la réflexion pour trouver toutes les propriétés. En gros:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Reflection.PropertyInfo prop = type.GetProperty(propertyName.ToString());
    Dans ce cas, mon binding marche lors de l'utilisation d'un objet MonObjetBase plutôt que IMonObjet. Mais cette solution ne me plait pas, car il faut que le client connaisse une implémentation, qui est alors utilisée plutôt que l'interface...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Par défaut
    T'as vérifier directement dans le code client comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Console.WriteLine(((IMonObjet)ObjetRemote)["ID"]);

  6. #6
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 31
    Par défaut
    Oui, cela fonctionne.
    Le binding fonctionne par code c#, mais pas avec le xaml.

    Apparemment le moteur de rendu du xaml n'est pas capable de gérer.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Par défaut
    faut vérifier que le xaml prenne en compte les []. Faut peut-être les remplacer par des &trucmuch; comme dans tout langage balisé classics

  8. #8
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 31
    Par défaut
    Pas de soucçi de ce côté là, la syntaxe xaml est correcte, j'ai teté avec le même objet mais non marshallByRef...

Discussions similaires

  1. [Eclipse][JBoss] Lancer un serveur JBoss en remote
    Par cowa dans le forum Wildfly/JBoss
    Réponses: 7
    Dernier message: 02/09/2008, 11h08
  2. Utilisations de flash remoting et com servers
    Par bolo dans le forum Flash
    Réponses: 8
    Dernier message: 11/07/2006, 10h04
  3. Bind ou pas Bind?
    Par jonzuzu dans le forum MFC
    Réponses: 4
    Dernier message: 19/03/2004, 10h00
  4. []Erreur sur second emploi collection binding
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/03/2004, 18h02
  5. Bind - sous-domaine
    Par _Gabriel_ dans le forum Réseau
    Réponses: 4
    Dernier message: 07/03/2004, 11h54

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