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 :

Commandes WPF avec un ComboBox


Sujet :

Windows Presentation Foundation

Vue hybride

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 53
    Par défaut Commandes WPF avec un ComboBox
    Bonsoir,
    Sous une architecture M-V-VM, je cherche à lier une commande à partir de ma couche ViewModel à un objet graphique ItemsControl (ComboBox, ListBox...).

    Si quelqu'un a une astuce merci de bien vouloir la poster.

    Très cordialement.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    Avec les Triggers (pour les changements de Properties du composant)
    Avec les DataTriggers pour les changements de propriétés coté ViewModel (binding)
    avec les EventTriggers pour les événements divers et variés que le contrôle dessiné dans le combobox pourrait lever/recevoir.

    ya de multiple façon d'invoquer une commande... généralement par un behavior attaché à un événement donné... donc typiquement avec un EventTrigger... ou les behaviors par défaut fournis par Blend.

    mais en fait sans en savoir plus, sur ce que tu as, et veux faire, quel genre d'événement et pour quel binding, il est difficile d'être précis.
    Donc si tu veux des infos, il va falloir être plus loquace.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 53
    Par défaut
    Merci cinemania pour ta réponse, je vais essayer d'être plus loquace comme tu me l'as suggérer tout en restant précis dans ma question.

    Admettons que j'ai un tableau DataGrid (XCEED ou autre) qui contient la liste de mes messages de type Message{string Titre, string Contenu}, le Contenu étant un texte très long, j'aimerais qu'en cliquant sur un message (une ligne du DataGrid) son Contenu puisse s'afficher dans un TextBox multilignes en bas du DataGrid.

    Comment faire ça à l'aide des commandes (en MVVM) ?

    L'idée d'utiliser des DataTrigger ou des EventTrigger m'intéresserait bien, mais je ne sais pas exactement comment procéder.

    J'aimerais bien avoir des bouts de codes en XAML pour que je puisse comprendre plus rapidement.

    D'avance merci pour vos réponses.
    Cordialement.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    Pas de commande uniquement du Databinding...

    en fait c assez simple, si tu a utiliser une ObservableCollection<Message> comme source pour remplir ta DataGrid

    tu récupère la vue par défaut (ICollectionView) de l'observablecollection, dans ton viewmodel, tu met un handler sur l'evement CurrentItemChanged

    et tu expose une propriété qui expose publiquement par exemple CurrentMessage de type Message, le CurrentItem de ta ICollectionView.

    dans ton handler tu te contente de dire que ta propriété CurrentMessage a changé d'état et ton textblock ou autre n'a plus qu'a binding CurrentMessage.Contenu.

    et le tour est joué, car à chaque fois que tu sélectionne une ligne, aussitot tu bind le contenu de l'élément sélectionné, mais cela ne fonctionne que si et uniquement si tu bind l'ItemsSource de ta DataGrid sur une ObservableCollection<Message>

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    Voici quelques exemples de code pour illustrer ma précédente réponse

    le viewModel
    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
    public class DGModel : ViewModelBase
    {
      #region Champs
      ICollectionView m_MView;
      #endregion
    
      #region Propriétés
      public ObservableCollection<Message> Messages { get; private set; }
      public Message CurrentMessage { get { return m_MView; } }
      #endregion
    
      #region Construction
      public DGModel()
      {
        Messages = new ObservableCollection<Message>(from n in Entities.Messages select n);
        m_MView = CollectionViewSource.GetDefaultView(Messages);
        if (m_MView != null)
          m_MView.CurrentItemChanged += OnMessageChanged;
      }
      #endregion
    
      #region Interne
      void OnMessageChanged(object sender, EventArgs e)
      {
        OnPropertyChanged("CurrentMessage");
      }
    
      // ... ici tout le reste de ton code logique spécifique à ton modèle de vue
      #endregion
    }
    et ici une petite partie du XAML...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      ...
      <dg:DataGrid Style="dgStyle" ItemsSource="{Binding Messages}" IsSynchronizedWithCurrent="True"/>
      ...
      <TextBlock Style="dgMultiline" Text="{Binding CurrentMessage.Contenu}"/>
      ...
    Le constructeur du ViewModel utilise du Linq to Entities pour remplir la collection observable de messages, mais tu fait ce que tu veux, c'est ici afin d'améliorer la lisibilité.

  6. #6
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Un peu plus simplement, je dirai qu'il te suffit de binder le contenu de ton TextBox multilignes sur la propriété Contenu du SelectedItem de ton DataGrid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBlock Text="{Binding Path=SelectedItem.Contenu, ElementName=tonDataGrid}"/>

Discussions similaires

  1. Ligne de commande DOS avec VB.net et WPF
    Par Jayme65 dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 16/02/2017, 15h51
  2. [WPF+C#.NET] Combobox avec image et texte
    Par Siphon dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 25/02/2011, 14h37
  3. Comment Afficher un Combobox dans une Gridview WPF avec le code seulement?
    Par aminems dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 25/08/2010, 13h48
  4. Commandes WPF avec plusieurs paramètres
    Par helper_moi dans le forum Windows Presentation Foundation
    Réponses: 15
    Dernier message: 15/06/2010, 16h41

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