C # WPF древовидная структура заполнена рекурсивным встроенным списком <> добавить элемент в позицию - PullRequest
1 голос
/ 24 августа 2010

Привет, у меня есть 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. Как я могу теперь бросить новый предмет в нужную позицию в моем списке? или обновите старый новыми значениями.

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

--- редактировать

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

1 Ответ

2 голосов
/ 26 августа 2010

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

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

...