2010-08-24 3 views
1

안녕 나는 hierarchicaldatatemplateC# WPF의 트 리뷰는 <> 위치에 항목을 추가

<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 

폴더와 하위 폴더로 채워집니다. 예를 들어 루트 폴더가이 개 하위 폴더를 가지고 있으며, 그들은 내가 지금 난 내 컬렉션에 새 파일 이름이나 Ordner 객체를 추가 할 몇 가지 방법을 통해 파일이나 폴더를 추가 할 때이 alt text

모양을이 개 하위 폴더가있는 경우. TreeView에서 SelectedItem 위치를 어떻게 찾을 수 있습니까? Im TreeView에서 SelectedItem을 버퍼링 할 때마다 selectedOrdner = (Ordner)DokumentBrowser.SelectedItem;이 변경되어이 항목에 새 파일 이름 또는 Ordner 객체를 추가합니다. 이제 새 목록을 내 목록의 올바른 위치에 던질 수 있습니까? 이전 값을 새 값으로 갱신하십시오.

인스턴트 메신저 개체를 찾으려면 항상 내 목록을 통해 재귀 적으로 이동해야합니까? 아니면 더 좋고 쉬운 방법으로 존재합니까?

--- 편집

내 Ordner 클래스가 관찰 컬렉션 싶게 그렇게 내가 그들을 제거 할 수 있습니다 보유하고있는 노드의 루트 노드 개체를 저장 구현 변경. 그것의 어쩌면 최고의 해결책이 아니지만 그것은 나를 위해 잘 작동

답변

2

나는 당신이 무엇을 요구하고 있는지 잘 모르겠다; 선택한 항목이 있으므로 하위 항목을 하위 항목에 삽입하는 등 모든 작업을 수행 할 수 있습니다. 당신이하려는 일에 대해 좀 더 자세하게 설명해야합니다.

선택한 항목의 형제를 추가하여 트리보기에 표시하려는 경우 LinkedList와 같이 정렬이 매우 쉽고 빠르도록 다른 데이터 구조를 살펴볼 수 있습니다. 반면에 ObservableCollection을 사용하여 항목을 저장하는 것이 좋습니다. 사용자 인터페이스의 변경 사항을 자동으로 반영하기 때문입니다. ObservableCollection의 특정 인덱스에 항목을 삽입 할 수도 있으므로 문제가 무엇인지 상상할 수 없습니다.

+0

+1 ObservableCollection –

+0

내 생각에는 큰 사고 문제가 있었는데 이제는 내 목록에 항목을 추가 할 때 좋습니다. 하지만 어떻게 파괴하거나 내 Treeview에서 SelectedItem 항목을 제거 할 수 있습니까? 목록에 보유하고있는 항목이 무엇인지 알지 못합니다. 나는 당신이 이해하기를 희망한다. – Mark

+1

MVVM 베스트 프랙티스와 함께 가고 싶다면 가장 쉬운 방법은 컬렉션을'ICollectionView's로 노출하는 것이다. ICollectionView는 ItemsControl에서 선택된 항목과 자동으로 동기화되므로 선택된 항목을 ViewModel에서 ICollectionView의 CurrentItem으로 사용할 수 있습니다. 코드 숨김 경로로 이동하면 선택한 _TreeViewItem_을 TreeView에서 직접 가져올 수 있으며 TreeView의 ItemContainerGenerator.ItemFromContainer 메서드를 호출하여 바인딩 된 항목을 가져올 수 있습니다. 추가 설명이 필요한 경우 알려주십시오. –

관련 문제