2010-08-24 5 views
1

Salut, j'ai un TreeView qui est rempli d'un HierarchicalDataTemplateC# WPF TreeView rempli de liste intégrée récursive <> add item à la position

<TreeView Name="DokumentBrowser" ItemTemplate="{StaticResource HierachrTree}" 

<HierarchicalDataTemplate x:Key="HierachrTree" 
    DataType="{x:Type src:Ordner}" 
    ItemsSource="{Binding UnterOrdner}"> 
        <TextBlock Text="{Binding OrdnerName}"/> 
     </HierarchicalDataTemplate> 

La classe qui est utilisée pour obtenir les objets ressemble à ce

#region OrdnerClass 
public class OrdnerListe : ObservableCollection<Ordner> 
{ 
    protected override void InsertItem(int index, Ordner item) 
    { 
     base.InsertItem(index, item); 
     this[index].PropertyChanged += new PropertyChangedEventHandler(OrdnerListe_PropertyChanged); 
    } 

    void OrdnerListe_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     OnCollectionChanged(new NotifyCollectionChangedEventArgs(
      NotifyCollectionChangedAction.Reset)); 
    } 
} 


public class Ordner : INotifyPropertyChanged 
{ 
    #region fields 
    private string _name, _path; //Ordnername 
    private Ordner _pordner; //Parent Ordner Objekt 
    private OrdnerListe _uordner; //Liste aus Ordner Objekten 
    private File_Liste _filename; // Liste der Dateien die in einem Ordner Liegen 
    #endregion 

    #region INotifyPropertyMember 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this,new PropertyChangedEventArgs(info)); 
     } 
    } 
    #endregion 

    #region konstruktor 
    public Ordner() 
    { 
     _uordner = new OrdnerListe(); 
     _filename = new File_Liste(); 
    } 
    #endregion 

    #region properties 
    public string OrdnerName 
    { 
     get { return _name; } 
     set 
     { 
      if (value != this._name) 
      { 
       this._name = value; 
       NotifyPropertyChanged("OrdnerName"); 
      } 
     } 
    } 

    public string OrdnerPfad 
    { 
     get { return _path; } 
     set 
     { 
      if (value != this._path) 
      { 
       this._path = value; 
       NotifyPropertyChanged("OrdnerPfad"); 
      } 
     } 
    } 

    public Ordner ParentDir 
    { 
     get { return _pordner; } 
     set 
     { 
      if (value != this._pordner) 
      { 
       this._pordner = value; 
       NotifyPropertyChanged("ParentDir"); 
      } 
     } 
    } 

    public OrdnerListe UnterOrdner 
    { 
     get { return _uordner; } 
     set 
     { 
      if (value != this._uordner) 
      { 
       this._uordner = value; 
       NotifyPropertyChanged("UnterOrdner"); 
      } 
     } 
    } 

    public File_Liste FileName 
    { 
     get { return _filename; } 
     set 
     { 
      if (value != this._filename) 
      { 
       this._filename = value; 
       NotifyPropertyChanged("FileName"); 
      } 
     } 
    } 
    #endregion 
} 
#endregion 

Il est rempli de dossiers et de leurs sous-dossiers. Par exemple quand le dossier racine a 2 sous-dossiers et ils ont 2 sous-dossiers cela ressemblera à ceci alt text

Quand j'ajoute maintenant des dossiers ou des chemises par des méthodes je veux ajouter les nouveaux noms de fichiers ou objets Ordner à ma collection. Comment puis-je trouver la position où est SelectedItem de TreeView? Im Mise en mémoire tampon de SelectedItem à partir de TreeView selectedOrdner = (Ordner)DokumentBrowser.SelectedItem; chaque fois qu'il a été modifié et ajoutez à cet élément les nouveaux noms de fichiers ou Ordner Objects. Comment puis-je maintenant placer le nouvel élément à la bonne position dans ma liste? ou mettez à jour l'ancien avec les nouvelles valeurs.

Dois-je toujours aller récursive dans ma liste pour trouver l'objet où je suis momentanément? ou existe-t-il un moyen meilleur et plus facile?

--- modifier

a changé ma classe Ordner mis en place une collection observable und sauver l'objet qui est le nœud racine des noeuds qu'il détient afin que je puisse les enlever. ce n'est peut-être pas la meilleure solution, mais cela fonctionne bien pour moi

Répondre

2

Je ne suis pas sûr de ce que vous demandez; puisque vous avez l'élément sélectionné, vous pouvez faire toutes sortes de choses avec, y compris l'insertion d'enfants. Vous devrez fournir un peu plus de détails sur ce que vous essayez de faire.

Si vous essayez d'ajouter des frères et sœurs de l'élément sélectionné et de les afficher dans l'arborescence, vous pouvez essayer différentes structures de données, ce qui rendrait l'insertion ordonnée très facile et rapide, comme LinkedList. D'un autre côté, je vous suggère également d'utiliser ObservableCollection pour contenir des éléments, car cela reflétera automatiquement les changements dans l'interface utilisateur. Vous pouvez également insérer des éléments à un index spécifique dans ObservableCollection, donc je ne peux pas imaginer quel serait le problème.

+0

+1 pour ObservableCollection –

+0

J'ai eu un problème majeur de réflexion là-bas, c'est correct maintenant quand j'ajoute des éléments à ma liste. Mais comment puis-je détruire ou supprimer l'élément qui est le SelectedItem de ma treeview? sans savoir quel est l'élément qui le contient dans la liste. J'espère que vous comprenez – Mark

+1

Si vous voulez aller avec les meilleures pratiques MVVM, je pense que la façon la plus simple est d'exposer les collections comme ICollectionView; ICollectionView est automatiquement synchronisé avec l'élément sélectionné dans ItemsControl - de sorte que l'élément sélectionné est disponible dans le ViewModel en tant que CurrentItem ICollectionView. En parcourant la route de code-behind, le _TreeViewItem_ sélectionné peut être obtenu directement à partir de TreeView, et vous pouvez obtenir l'élément lié en appelant la méthode ItemContainerGenerator.ItemFromContainer de treeview. Faites-moi savoir si vous avez besoin de plus de précisions. –

Questions connexes