2013-12-04 5 views
0

Я новичок в WPF и пытаюсь обвести вокруг себя предпочтительный способ обработки данных. Я нашел этот link, который объясняет привязку данных к древовидной структуре. Я попытался создать свой код аналогичным образом, но я не понимаю, почему этот код работает отлично, а мой - нет.WPF не может заполнить treeview

Во всяком случае, я определил некоторый класс для художников/альбомы/песни

class LibArtist 
{ 
    public string Name { get { return mName; } } 
    string mName; 
    public ObservableCollection<LibAlbum> Albums; 

    public LibArtist(string name) 
    { 
     mName = name; 
     Albums = new ObservableCollection<LibAlbum>(); 
    } 


} 

class LibAlbum 
{ 
    public string Name { get { return mName; } } 
    public string Artist { get { return mArtist.Name; } } 
    public uint Year { get { return mYear; } } 
    public ObservableCollection<LibSong> mSongs = new ObservableCollection<LibSong>(); 
    uint mYear; 
    LibArtist mArtist; 
    string mName; 

    public LibAlbum(string pName, LibArtist pArtist, uint pYear) 
    { 
     mName = pName; 
     mArtist = pArtist; 
     mYear = pYear; 
    } 
} 
class LibSong 
{ 
    public string Title { get { return mName; } } 
    public string Artist { get { return mArtist; } } 
    public string Album { get { return mAlbum; } } 
    public string Location { get { return mLocation; } } 
    public uint Year { get { return mYear; } } 
    string mName; 
    uint mYear; 
    string mAlbum; 
    string mArtist; 
    string mLocation; 
    public LibSong(string pSongLocation) 
    { 
     mLocation = pSongLocation; 
     TagLib.File lFile = TagLib.File.Create(pSongLocation); 
     mAlbum = lFile.Tag.Album; 
     mName = lFile.Tag.Title; 
     mArtist = lFile.Tag.AlbumArtists.Length > 0 ? lFile.Tag.AlbumArtists[0] : "???"; 
     //use tag lib to fill the data if this file exists 
     mYear = lFile.Tag.Year; 
    } 

    public override bool Equals(object obj) 
    { 
     LibSong temp = obj as LibSong; 
     if (temp == null) 
      return false; 
     if (temp.Location == this.Location) 
      return true; 
     if (temp.Artist == this.Artist && temp.Album == this.Album && temp.Year == this.Year) 
      return true; 
     return false; 
    } 
} 

И они сидят в классе библиотеки:

class Library 
{ 
    public SortedDictionary<string, List<string>> mArtistsToAlbums; 
    SortedDictionary<string, List<LibSong>> mAlbumsToSongs; 
    public List<LibSong> mSongList; 
    public ObservableCollection<LibSong> mSongList2; 
    public ObservableCollection<LibAlbum> mAlbumList; 

    public ObservableCollection<LibArtist> mArtistList; 
    ... 
} 

В моем главном окне, я поставил контекст данных моей TreeView к объекту библиотеки:

public MainWindow() 
    { 
     mPlayer = new izPlayer(0); 


     InitializeComponent(); 

     libraryTreeView.DataContext = mLibrary; 
     mLibrary = new Library(); 
     mLibrary.CreateTestData(); 

В моем XAML, я определяю TreeView как так:

<TreeView Name="libraryTreeView" 
     HorizontalAlignment="Left" 
     ItemsSource="{Binding mArtistList}" 
     Height="443" Margin="10,50,0,0" VerticalAlignment="Top" Width="344" MouseDoubleClick="libraryTreeView_MouseDoubleClick" 
     > 
     <TreeView.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}" /> 
      </DataTemplate> 
     </TreeView.ItemTemplate>  
    </TreeView> 

И когда я запускаю это, я ничего не вижу в древовидной структуре. Как я уже сказал, я не уверен, почему это отличается от кода примера или почему он не отображает данные в файле mArtistList.

Любая помощь будет оценена!

ответ

1

Специально для ответа на TreeView Денниса является большим ресурсом. Если вы не получаете какие-либо предметы даже на верхнем уровне, это может быть связано с неверными источниками привязки. Похоже, Library объявляет открытые поля

public ObservableCollection<LibArtist> mArtistList; 

Для того, чтобы использовать связывание в XAML эти источники должны быть открытыми свойствами

public ObservableCollection<LibArtist> mArtistList { get; set; } 
+0

Это сделало трюк, хотя я также начал получать сообщение о том, что элементы должны быть пустыми для itemSource, которые будут использоваться, даже если я не настройки. Clear() сделал трюк, хотя и все, похоже, работает. Спасибо! – Kolichikov

0

Это полностью отличается от кода примера (я имею в виду разницу XAML).

Основная концепция связанного с данными TreeView в WPF заключается в том, что вы должны указать hierarchical data templates для своих узлов, поскольку вы хотите отображать иерархические данные.

Ваш XAML должен выглядеть следующим образом:

<TreeView.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type yourNamespace:LibArtist}" ItemsSource="{Binding Albums}"> 
    <!-- the template tree for displaying artist's data --> 
    </HierarchicalDataTemplate> 

    <HierarchicalDataTemplate DataType="{x:Type yourNamespace:LibAlbum}" ItemsSource="{Binding Songs}"> 
    <!-- the template tree for displaying song's data --> 
    </HierarchicalDataTemplate> 

    <!-- and so on --> 
</TreeView.Resources> 
+0

К сожалению, это был мой плохой. После того, как я начал разбираться с файлом, чтобы попытаться выяснить, что случилось, я попробовал посмотреть, появится ли только список без иерархии. – Kolichikov