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.
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.
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.
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.
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>
Voici quelques exemples de code pour illustrer ma précédente réponse
le viewModel
et ici une petite partie du XAML...
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 }
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é.
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}"/> ...
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}"/>
Partager