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 :

Binding vers un contrôle d'une autre classe


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2010
    Messages : 11
    Par défaut Binding vers un contrôle d'une autre classe
    Bonjour à tous,

    ma question peut paraître bête mais la voici :

    Je cherche à pouvoir récupérer la valeur selectionnée d'une combo qui se trouve dans une autre classe.

    Je m'explique, j'ai dans mon application, une classe permettant de choisir la base de données sur laquelle se connecter. Ce choix se présente sous forme d'une combobox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <Grid x:Name="LayoutRoot" Style="{StaticResource CustomerGridStyle}">
            <ComboBox Height="18" HorizontalAlignment="Left" Margin="0,1,0,0" Name="cbCustomer" VerticalAlignment="Top" Width="200" Loaded="cbCustomer_Loaded"  />
            <Button Content="OK" Height="18" HorizontalAlignment="Left" Margin="205,1,0,0" Name="btnOK" VerticalAlignment="Top" Width="30" />
        </Grid>
    Et dans une autre classe, j'essaie d'accéder à la valeur choisie dans cette combo pour moi passer cette valeur en question en paramètre à une de mes méthodes. J'essaie donc de faire ceci mais je vois bien que ce n'est pas ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <riaControls:Parameter ParameterName="dbName" Value="{Binding ElementName=DBName, Path=cbCustomer.SelectedItem}" />
    Faut-il indiquer quelque part le nom de la classe en question? Mais comment? Bref, je ne sais pas trop comment faire.
    Pourriez-vous me donner un coup de main?

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Bonjour,

    La combobox et le control Parameter se trouve dans le même usercontrol ?

    si oui tu peux faire quelquechose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <riaControls:Parameter ParameterName="dbName" Value="{Binding ElementName=cbCustomer, Path=SelectedItem}" />
    si non, tu devrais passer par une classe commune héritant de INotifyPropertyChanged afin de notifier à l'interface utilisateur que quelque chose vient de changer et de le prendre en compte via le binding.

    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
    21
    22
     
    public class DataViewModel : INotifyPropertyChanged
    {
      public object SelectedItem
      {
          get
          {
                return _selectedItem;
          }
     
          set
          {
               if( _selectedItem != value )
               {
                    _selectedItem = value;
                   this.RaisePropertyChanged("SelectedItem");
               }
          }
      }
     
      private object _selectedItem = null; 
    }
    dans les loads des controles contenant la combobox et Parameter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
    public void Loaded(...)
    {
         this.LayoutRoot.DataContext = this;
    }
    ...
    propdp DataViewModel (propertyDependency)
    ...
    ensuite pour la ComboBox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <ComboBox Height="18" HorizontalAlignment="Left" Margin="0,1,0,0" Name="cbCustomer" VerticalAlignment="Top" Width="200" Loaded="cbCustomer_Loaded" SelectedItem="{Binding DataViewModel.SelectedItem, Mode=TwoWay}"  />
    et enfin le control Parameter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <riaControls:Parameter ParameterName="dbName" Value="{Binding DataViewModel.SelectedItem}" />
    Pour cette deuxieme solution, plus complexe, on entre dans le pattern MVVM

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2010
    Messages : 11
    Par défaut
    Merci pour ta réponse rapide.

    J'ai essayé d'appliquer ce que tu as dit mais n'y arrive pas

    Pour la nouvelle classe DataViewModel j'obtiens une erreur. Il ne reconnait pas le RaisePropertyChanged
    Error 'DataViewModel' does not contain a definition for 'RaisePropertyChanged' and no extension method 'RaisePropertyChanged' accepting a first argument of type 'DataViewModel' could be found (are you missing a using directive or an assembly reference?)
    Et ensuite j'avoue que je ne comprends pas trop ce que tu voudrais que je fasse avec ceci...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    propdp DataViewModel (propertyDependency)
    J'ai cru comprendre avec la documentation que je devais faire plus ou moins quelque chose comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public int MyProperty
            {
                get { return (int)GetValue(MyPropertyProperty); }
                set { SetValue(MyPropertyProperty, value); }
            }
     
            public static readonly DependencyProperty MyPropertyProperty =
                    DependencyProperty.Register("MyProperty", typeof(int), typeof(MyType), new PropertyMetada(true));
            }
    Mais je ne comprends pas trop... Là il me souligne "MyType" et PropertyMetaData.
    Je ne comprends pas trop quoi mettre à la place et si c'est bien quelque chose ainsi que je dois faire

    Merci encore et désolée pour ma non connaissance...

  4. #4
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Commence par regarder ce tuto de Benjamin Broux qui explique très bien les différents principes de Binding dans SL :

    http://broux.developpez.com/articles...g-silverlight/

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2010
    Messages : 11
    Par défaut
    Voilà, j'ai lu tout le tuto. Et suite à cela, voici mes modifications.

    Plus d'erreur dans ma classe DataViewModel. La voilà au complet:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    using System;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Ink;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.ComponentModel;
     
    namespace CRMobile.AdminTools.Views
    {
        public class DataViewModel : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
     
            private object _selectedItem = null;
     
            public object SelectedItem
            {
                get
                {
                    return _selectedItem;
                }
     
                set
                {
                    if (_selectedItem != value)
                    {
                        _selectedItem = value;
                        this.RaisePropertyChanged("SelectedItem");
                    }
                }
            }
     
            #region RaisePropertyChanged Members
     
            public void RaisePropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
     
            }
     
            #endregion
        }
    }
    Et voici ce que j'ai ajouté au niveau de ma classe CustomerCombobox:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static readonly DependencyProperty ValeurProperty; 
     
            static CustomerCombobox()
            {
                //1er paramètre : nom de la propriété qui pourra être utilisé en XAML
                //Paramètres 2 et 3 : Indique que chaque objet de type CustomerComboBox(param3) aura une propriété de type object (param2)
                ValeurProperty = DependencyProperty.Register("DataViewModel.SelectedItem", typeof(object), typeof(CustomerCombobox), new PropertyMetadata(true));
                //ValeurProperty : Clef qui permet de référencer cette propriété depuis le code, quand on veut faire une opération sur cette propriété.
            }
    Mais pas de chance, ça ne fonctionne toujours pas. J'ai mis des BreakPoints un peu partout, entre autre dans ma classe DataViewModel, mais jamais ils ne sont atteints.

    Merci encore.

  6. #6
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    1°) ta DataViewModel est bien construite
    2°) montre nous le Binding que tu emploies sur ta ComboBox

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/05/2015, 15h52
  2. Réponses: 0
    Dernier message: 31/05/2010, 14h55
  3. Garder une référence vers une variable d'une autre classe
    Par choupeo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/12/2007, 18h30
  4. Contrôle d'une fenêtre par une autre classe
    Par SuperWeight dans le forum Windows
    Réponses: 4
    Dernier message: 19/04/2007, 16h01
  5. Réponses: 5
    Dernier message: 09/03/2007, 10h07

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