Дерево C # WPF, заполненное рекурсивным построенным списком <> добавить элемент в позицию

Привет, у меня есть TreeView, заполненный иерархической таблицей данных

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

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

Класс, который используется для получения объектов, выглядит так

#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

Он заполнен папками и их подпапками. Например, когда в корневой папке есть 2 подпапки, и у них есть 2 подпапки, это будет выглядеть так alt text

Когда я теперь добавляю файлы или папки с помощью некоторых методов, я хочу добавить новые имена файлов или объекты Ordner в мою коллекцию. Как я могу найти позицию, в которой находится SelectedItem из TreeView? Я буферизирую SelectedItem из TreeView selectedOrdner = (Ordner) DokumentBrowser.SelectedItem; каждый раз при его изменении и добавляю к этому элементу новые имена файлов или объекты Ordner. Как теперь переместить новый элемент в нужное место в моем списке? или обновите старые значения новыми.

Всегда ли я должен проходить через мой список рекурсивно, чтобы мгновенно найти там объект? или существует лучший и более простой способ?

--- edit

изменил мой класс Ordner, реализовал наблюдаемую коллекцию и сохранил объект, который является корневым узлом узлов, которые он содержит, чтобы я мог их удалить. это, возможно, не лучшее решение, но оно отлично работает для меня

1
задан Mark 3 September 2010 в 08:34
поделиться

1 ответ

Я не совсем понимаю, о чем вы спрашиваете; поскольку у вас есть выбранный элемент, вы можете делать с ним все что угодно, включая вставку в него дочерних элементов. Вам нужно будет предоставить немного больше информации о том, что вы пытаетесь сделать.

Если вы пытаетесь добавить одноуровневых элементов выбранного элемента и сделать так, чтобы они отображались в древовидном представлении, вы можете попробовать найти для них другие структуры данных, которые сделают упорядоченную вставку очень простой и быстрой, например LinkedList. С другой стороны, я также предлагаю вам использовать ObservableCollection для хранения элементов, так как он будет автоматически отражать изменения в пользовательском интерфейсе. Вы также можете вставлять элементы по определенному индексу в ObservableCollection, поэтому я не могу представить, в чем может быть проблема.

2
ответ дан 2 September 2019 в 21:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: