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 :

Ajouter la propriété IsSynchronizedWithCurrentItem à un TreeView avec une attached property


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut Ajouter la propriété IsSynchronizedWithCurrentItem à un TreeView avec une attached property
    Bonjour,

    comme dit dans le titre, je cherche à ajouter la propriété IsSynchronizedWithCurrentItem à un contrôle TreeView.

    J'ai développé un TreeView sur lequel j'ai bindé plusieurs collections d'objets différentes. J'ai par exemple, une ObservableCollection<Outil>, une ObservableCollection<Machine>, etc.

    Mon but est que l'élément sélectionné dans le treeview (sous réserve que celui-ci fasse parti d'une des listes bindées) soit mis comme objet courant de la CollectionView associée. Ainsi, le détail de l'élément sélectionné est automatiquement affiché dans une vue "Détail".

    Je me suis appuyé sur un code trouvé sur le net.
    Ce code utilise une attached property appelé IsSynchronizedWithCurrentItem en référence à la propriété de même nom de la classe Selector. L'idée est que cette attached property fonctionne dans un premier temps avec un treeview mais si possible avec d'autres contrôles.
    Le principe est d'utiliser l'évènement SelectedItemChanged.

    Code c# : 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
     
    public class SelectorExtension
        {
            static List<Control> _selectors = new List<Control>();
     
            public static readonly DependencyProperty IsSynchronizedWithCurrentItemProperty =
                DependencyProperty.RegisterAttached("IsSynchronizedWithCurrentItem",
                typeof(bool), typeof(SelectorExtension),
                new FrameworkPropertyMetadata(false, (s, e) =>
                {
     
                    var control = s as TreeView;
     
                    if (control == null)
                    {
                        return;
                    }
     
                    if ((bool)e.NewValue)
                    {
                        control.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(control_SelectedItemChanged);
                        _selectors.Add(control);
                    }
                    else
                    {
                        if (_selectors.Contains(control))
                        {
                            _selectors.Remove(control);
                        }
                    }
                }));
     
            public static void SetIsSynchronizedWithCurrentItem(UIElement element, Boolean value)
            {
                element.SetValue(IsSynchronizedWithCurrentItemProperty, value);
            }
            public static Boolean GetIsSynchronizedWithCurrentItem(UIElement element)
            {
                return (Boolean)element.GetValue(IsSynchronizedWithCurrentItemProperty);
            }
     
            static void control_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
            {
                // Code
            }

    Ainsi j'ai à ma disposition:
    - la propriété Treeview.SelectedItem qui retourne l'objet "métier" sélectionné si celui-ci fait bien parti de l'une des collections bindé au TreeView, sinon elle retourne un TreeViewItem.
    - l'élément courant peut être défini avec la méthode CollectionView.MoveCurrentTo(Object item).

    Selon moi, il faut que je trouve le moyen de récupérer la CollectionView de la collection dont fait parti l'objet récupéré avec la propriété TreeView.SelectedItem, et je ne sais pas trop comment faire.
    Bref, je m'y perds un peu et j'aurais besoin de votre aide.
    Auriez-vous une idée pour que je puisse résoudre ma problématique ?

    Merci d'avance,
    Zoax

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Pourquoi ne pas créer une CollectionVIew dès le départ et le binder directement sur ta TreeView. Vu que t'as déjà l'instance de ta CollectionView t'auras pas besoin de la chercher ?

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    merci pour la réponse.
    Je binde à mon TreeView une instance de la classe suivante.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class EditionFavoriModel
    {
      public ObservableCollection<Outil> Outils {get;set;}
      public ObservableCollection<Machine> Machines{get;set;}
      public ObservableCollection<Accessoire> Accessoires{get;set;}
      [..]
    }

    Voici le code de mon TreeView (un peu simplifié car je ne l'ai pas sur moi):
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            <TreeView>
                <TreeViewItem Header="Mes outils" ItemsSource="{Binding Outils}"/>
                <TreeViewItem Header="Mes machines" ItemsSource="{Binding Machines}"/>
                <TreeViewItem Header="Mes accessoires" ItemsSource="{Binding Accessoires}"/>
            </TreeView>

    Comme vous pouvez le constater, plusieurs collections sont bindés au TreeView. Il me semble qu'une collectionview est implicitement créé pour chacune des collections bindées, du coup je n'ai pas qu'une seule collectionview mais plusieurs.
    La difficulté est donc de retrouver la collectionview correspondant à l'objet sélectionné.

    Merci d'avance,
    Zoax

Discussions similaires

  1. Ajouter un indice sur un submit avec une image
    Par pasc06 dans le forum Langage
    Réponses: 3
    Dernier message: 21/01/2009, 14h32
  2. [Source] Nourrir un TreeView avec une base de données
    Par zooffy dans le forum Contribuez
    Réponses: 12
    Dernier message: 08/03/2008, 04h58
  3. Réponses: 2
    Dernier message: 09/11/2007, 15h32
  4. Réponses: 3
    Dernier message: 05/10/2007, 13h19
  5. treeview avec une base de donnée Access
    Par yannba dans le forum Composants VCL
    Réponses: 2
    Dernier message: 27/01/2006, 12h49

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