안녕 나는 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 객체를 추가 할 몇 가지 방법을 통해 파일이나 폴더를 추가 할 때이
모양을이 개 하위 폴더가있는 경우. TreeView에서 SelectedItem 위치를 어떻게 찾을 수 있습니까? Im TreeView에서 SelectedItem을 버퍼링 할 때마다 selectedOrdner = (Ordner)DokumentBrowser.SelectedItem;
이 변경되어이 항목에 새 파일 이름 또는 Ordner 객체를 추가합니다. 이제 새 목록을 내 목록의 올바른 위치에 던질 수 있습니까? 이전 값을 새 값으로 갱신하십시오.
인스턴트 메신저 개체를 찾으려면 항상 내 목록을 통해 재귀 적으로 이동해야합니까? 아니면 더 좋고 쉬운 방법으로 존재합니까?
--- 편집
내 Ordner 클래스가 관찰 컬렉션 싶게 그렇게 내가 그들을 제거 할 수 있습니다 보유하고있는 노드의 루트 노드 개체를 저장 구현 변경. 그것의 어쩌면 최고의 해결책이 아니지만 그것은 나를 위해 잘 작동
+1 ObservableCollection –
내 생각에는 큰 사고 문제가 있었는데 이제는 내 목록에 항목을 추가 할 때 좋습니다. 하지만 어떻게 파괴하거나 내 Treeview에서 SelectedItem 항목을 제거 할 수 있습니까? 목록에 보유하고있는 항목이 무엇인지 알지 못합니다. 나는 당신이 이해하기를 희망한다. – Mark
MVVM 베스트 프랙티스와 함께 가고 싶다면 가장 쉬운 방법은 컬렉션을'ICollectionView's로 노출하는 것이다. ICollectionView는 ItemsControl에서 선택된 항목과 자동으로 동기화되므로 선택된 항목을 ViewModel에서 ICollectionView의 CurrentItem으로 사용할 수 있습니다. 코드 숨김 경로로 이동하면 선택한 _TreeViewItem_을 TreeView에서 직접 가져올 수 있으며 TreeView의 ItemContainerGenerator.ItemFromContainer 메서드를 호출하여 바인딩 된 항목을 가져올 수 있습니다. 추가 설명이 필요한 경우 알려주십시오. –