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 :

Combobox - SelectedIndex qui est trouvé mais ne s'affiche pas [MVVM]


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut Combobox - SelectedIndex qui est trouvé mais ne s'affiche pas
    Bonjour @ tous,

    J'ai un cas de figure un peu tordu.
    Dans une popup, j'ai une combobox chargée complètement en XAML, lié à mon ViewModel..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                <ComboBox Grid.Column="1" Grid.Row="0" Name="cbGroup" SelectedIndex="0">
                    <ComboBoxItem Content="{Binding ElmtInfo.Tag}"/>
                </ComboBox>
    Dans mon ViewModel (simplifié ici) :
    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
    public class ViewModelPlanningEtudes: ViewModelBase {
            ...
            public GanttRowGroup ElmtInfo { get { return _ElmtInfo; } set { _ElmtInfo = value; RaisePropertyChanged(nameof(ElmtInfo));  } }
            public GanttRow RowInfo { get { return _RowInfo; } set { _RowInfo = value; RaisePropertyChanged(nameof(RowInfo)); } }
            public GanttTask TaskInfo { get { return _TaskInfo; } set { _TaskInfo = value; RaisePropertyChanged(nameof(TaskInfo)); } }
            void SendInfo(Tuple<GanttRowGroup, GanttRow, GanttTask> obj) {
                if (obj != null) {
                    Messenger.Default.Send<MessageCommunicator>(new MessageCommunicator() { GanttGroup = obj.Item1, GanttRow=obj.Item2, GanttTask=obj.Item3 });
                }
            }
     
            void ReceiveInfo() {
                Messenger.Default.Register<MessageCommunicator>(this, (obj) => {
                        this.ElmtInfo = obj.GanttGroup; // Stocke l'objet.
                        this.RowInfo = obj.GanttRow;
                        this.TaskInfo = obj.GanttTask;
                });
            }
    }
    Mon model ressemble à ça:
    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
        public class GanttRowGroup: GanttBase {
     
            private object _tag;
            public object Tag { get { return _tag; } set { _tag = value; OnPropertyChanged(nameof(Tag)); } }
            public ObservableCollection<GanttRow> Rows { get; set; }
     
            public GanttRowGroup() {
                Rows = new ObservableCollection<GanttRow>();
            }
     
            public override string ToString() {
                return (Tag!=null)? Tag.ToString(): "GanttRowGroup";
            }
     
        }
     
        public class GanttBase: DependencyObject, INotifyPropertyChanged {
        ....
        }
    Et (important), mon Tag contient un autre objet complexe, qui est une copie de la structure de Gantt, mais orienté BDD.
    Lorsque je veux lancer ma popup, j'utilise le messager (du MVVM Light) pour charger les objets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                            m.SendCommand.Execute(new Tuple<GanttRowGroup, GanttRow, GanttTask>(g, r, t));
                            pppTaskEdit.IsOpen = true;
    Jusque là tout, fonctionne très bien.

    Mais pour aller plus loin, j'avais besoin de manipuler les objets du Gantt, et non plus, des tag des objets (un niveau plus haut, donc).
    Pas de soucis, me dis-je, il suffit de charger la CB directement dur l'objet du GANTT (d'ôter juste le Tag, donc):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                <ComboBox Grid.Column="1" Grid.Row="0" Name="cbGroup" SelectedIndex="0">
                    <ComboBoxItem Content="{Binding ElmtInfo}"/>
                </ComboBox>
    Mais là, surprise, il me met ma CB à vide, et si je la déroule, l'élément désiré est bien sélectionné.
    Encore plus fort, si je valide mon formulaire (en laissant la CB à vide, telle qu'elle a été chargée), c'est bien l'élément désiré que est retourné, alors que visuellement, la sélection de la CB est à vide si on ne la déroule pas. 0_0

    J'ai essayé des SelectedValuePath, de la charger via le codeBehind par selectedIndex et SelectedItem, mais c'est toujours la même chose.
    C'est un comportement que j'ai reproduit sur un autre objet, qui possède plusieurs items et un SelectedItem non pas à 0, mais Bindé sur un objet. Toujours le même soucis (les rows de ElmtInfo, en l'occurence).

    Est ce que quelqu'un a une idée ?

    Merci d'avance.

  2. #2
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Peut-être une piste (peut-être...)
    J'ai essayé de surcharger Equals dans GanttRowGroup, pour débugger, mais il ne veux pas l'overrider car mon GanttBase (dont hérite GanttRowGroup) hérite de DependencyObject qui, lui, est sealed.
    Par contre, je peux bien l'implémenter dans l'objet de mon GanttRowGroup.Tag.

    Est ce que ça peut avoir un lien ?

    Je ne suis pas sur, car il trouve malgré tout l'élément dans la liste... Juste il ne le met pas au display.

  3. #3
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Bon, je ne saurais pas trop expliquer pourquoi, mais c'est bien le dependencyObject qui faisait planter la CB.
    Cette surcharge était utilisé uniquement pour les task, du coup, j'ai transphormé les DependencyProperty en propriétés simples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            /*public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register(nameof(IsSelected), typeof(bool), typeof(GanttTask), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsMeasure));
            public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.Register(nameof(IsEnabled), typeof(bool), typeof(GanttTask), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsMeasure));
            public bool IsEnabled { get { return (bool)GetValue(IsEnabledProperty); } set { SetValue(IsEnabledProperty, value); } }
            public bool IsSelected { get { return (bool)GetValue(IsSelectedProperty); } set { SetValue(IsSelectedProperty, value); } } // */
            bool _IsEnabled;
            public bool IsEnabled { get { return _IsEnabled; } set { _IsEnabled = value; OnPropertyChanged(nameof(IsEnabled)); } }
            bool _IsSelected;
            public bool IsSelected { get { return _IsSelected; } set { _IsSelected = value; OnPropertyChanged(nameof(IsSelected)); } }
    J'aimerais savoir ce que ça change exactement...

  4. #4
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    A première vue, je ne suis pas le seul a me poser la question (22 900 résultats) :
    http://stackoverflow.com/questions/2...y-in-viewmodel
    http://www.codeproject.com/Articles/...ropertyChanged

    En gros, DP est plus performant (un peu), mais ne gère pas la serialisation.

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

Discussions similaires

  1. Réponses: 34
    Dernier message: 24/09/2014, 20h26
  2. Réponses: 4
    Dernier message: 29/08/2009, 11h44
  3. Réponses: 2
    Dernier message: 07/05/2008, 12h02
  4. Les données sont dans la base, mais ne s'affichent pas
    Par ryan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 31/03/2006, 10h59

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