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

Silverlight Discussion :

Problème d'afficahge d'un UserControl dans une vue et ... comment communiquer entre deux ViewModel ?


Sujet :

Silverlight

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut Problème d'afficahge d'un UserControl dans une vue et ... comment communiquer entre deux ViewModel ?
    Bonjour,

    J'ai une vue "Administration" qui devrait me permettre de sélectionner (ou d'en créer, ou modifier) un Client. M'afficher pour le client sélectionné, différents contrats (ou d'en créer, ou les modifier), et pour le contrat sélectionné, m'afficher (ou créer, ou modifier) des factures....

    Je peux évidemment créer une seule vue et un seul ViewModel, mais vu la complexité de la vue, je ne vais pas m'y retrouver.

    J'ai opté de travailler avec des UserControl, un pour la sélection du client, un pour les contrats et un pour les factures.

    Je fais un ViewModel par UserControl plus évidemment un pour mon AdministrationView.

    J'ai deux questions:

    Quand j'insère en mode design le UserControl "ucClient" dans mon "AdministrationView" j'ai l'erreur suivante:

    InvalidOperationException was thrown on "ucClient": Cannot create an instance of "ucClient"

    et encore,

    Domain operations cannot be started at design time.
    at System.ServiceModel.DomainServices.Client.WebDomainClient`1.get_ChannelFactory()
    at System.ServiceModel.DomainServices.Client.WebDomainClient`1.BeginQueryCore(EntityQuery query, AsyncCallback callback, Object userState)
    at System.ServiceModel.DomainServices.Client.DomainClient.BeginQuery(EntityQuery query, AsyncCallback callback, Object userState)
    alors que ucClient s'ouvre bien en mode design.

    Ma deuxième question est :

    Comme ucClient contient un comboBox, dans mon ucClientViewModel, je peux facilement savoir quel est mon SelectedItemDansComboBox en faisant un binding sur le SelectedItem de mon combo et SelectedItemDansComboBox du ucClientViewModel.

    Mon problème, c'est que je voudrais également avoir une propriété SelectedItemDansComboBox disponible dans mon AdministrationView. Comment "synchroniser" une propriété d'un ViewModel vers un autre ?

  2. #2
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 99
    Points : 152
    Points
    152
    Par défaut
    Bonjour,

    Il faut séparer/découper ton code, tu as donc bien fait de créer plusieurs View et ViewModel dans ta vue d'administration.

    Pour ton erreur, j'ai l'impression que ça vient d'un appel à un webservice...

    Pour ta 2ème question, tu peux jouer sur les events pour faire remonter l'info à ton ViewModel "parent", on parle en général de Messenger ou EventAggregator (dans le MVVM Light Toolkit par exemple)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Merci pour tes réponses

    1ère Q.
    Je fais effectivement dans le constructeur de mon viewModel appel à un Ria Service pour charger mon combobox client. Ce que je ne comprend pas, c'est pourquoi quand j'ouvre le userControl seul en mode design il s'affiche, mais pas quand ce dernier est inséré dans une autre vue.

    2ème Q.

    J'utilise pas mvvmlight est-ce quand même possible ? un exemple ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Je m'auto-répond pour la première question, je compte sur vous pour la deuxième

    En fait mon userControl ne s'affiche pas car il fait un appel à RIA service ce qui n'est pas permis en mode design.

    Dans le constructeur de mon UserControl, j'ai rajouté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public ucClientDisplay()
            {
                InitializeComponent();
                if (DesignerProperties.IsInDesignTool){ return; }
                this.DataContext = new ucClientDisplayViewModel();
            }
    et maintenant, il s'affiche.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    pour la deuxième question:

    voici une solution qui n'est certainement pas très élégante mais qui a le mérite de fonctionner. Je laisse en tous cas le post ouvert un certain temps dans l'espoir de recevoir une solution plus propre.

    Petit rappel, le but est de mettre à jour une propriété dans un ViewModel "AdministrationViewModel" dès qu'une propriété semblable est modifiée dans un autre ViewModel "ucClientDisplayViewModel".

    je crée d'abord une variable statique de mon viewModel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static AdministrationViewModel gAdministrationViewModel;
    ensuite, dans le code behind de ma vue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     public AdministrationView()
            {
                InitializeComponent();
                Global.clsGlobal.gAdministrationViewModel= new ViewModel.AdministrationViewModel();
                this.DataContext = Global.clsGlobal.gAdministrationViewModel;
            }
    ensuite, dans le AdministrationViewModel, je rajoute une copie de la propriété qui existe déjà dans mon ucClientDisplayViewModel:
    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
     public ClientTbl CboClientSelectedItem
            {
                get
                {
                    return _cboClientSelectedItem;
                }
                set
                {
                    if (_cboClientSelectedItem != value)
                    {
                        _cboClientSelectedItem = value;
                        OnPropertyChanged("CboClientSelectedItem");
                    }
                }
     
            }
    et enfin, dans la propriété qui se trouve dans ucClientDisplayViewModel, je rajoute la ligne soulignée:
    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
     public ClientTbl CboClientSelectedItem
            {
                get
                {
                    return _cboClientSelectedItem;
                }
                set
                {
                    if (_cboClientSelectedItem != value)
                    {
                        _cboClientSelectedItem = value;
    
                        Global.clsGlobal.gAdministrationViewModel.CboClientSelectedItem = value;
                        OnPropertyChanged("CboClientSelectedItem");
                    }
                }
    Le but est atteint puisque chaque fois que je sélectionne un élément dans le combobox de mon UserControl, j'ai un textBox contenu dans ma vue principale qui est binder sur la propriété de mon AdministrationViewModel.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/04/2015, 11h15
  2. Réponses: 10
    Dernier message: 12/05/2008, 18h10
  3. [SQL] Problème d'affichage de caractère spéciaux dans une variable chaîne
    Par Kryptonaute dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/08/2006, 08h40
  4. problème de zero apres la virgule dans une table
    Par mosca_coroneja dans le forum Outils
    Réponses: 11
    Dernier message: 08/04/2006, 21h57
  5. [MySQL] Problème d'initialisation de la valeur dans une table
    Par priazu dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 27/02/2006, 02h00

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