2013-04-09 2 views
0

Это мой первый набег на Иерархические данные, и у меня есть небольшая проблема.Не удается получить Silverlight HierarchicalDataTemplate для отображения палитр IsolatedStorage

В Silverlight 4, я пытаюсь получить список изолированных папок хранения для отображения в TreeView. Ничего не видно. My Treeview полностью пуст. Что мне не хватает? Я получаю данные, и это правильно.

Любая помощь будет оценена по достоинству.

XAML

<sdk:TreeView x:Name="FolderTreeView" Grid.Column="0" Margin="0,0,3,0" ItemsSource="{Binding _Folders}"> 
      <sdk:TreeView.ItemTemplate> 
       <sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Folders}"> 
        <TextBlock Margin="0" Text="{Binding Name, Mode=OneWay}"/> 
       </sdk:HierarchicalDataTemplate> 
      </sdk:TreeView.ItemTemplate> 
     </sdk:TreeView> 

CS

internal class Folder 
{ 
    public Folder() { Folders = new List<Folder>(); } 
    public string Name { get; set; } 
    public List<Folder> Folders { get; set; } 
} 

private List<Folder> _Folders = new List<Folder>(); 
public OpenFileDialog() 
{ 
    InitializeComponent(); 

    ifs = IsolatedStorageFile.GetUserStoreForApplication(); 
    var folder = new Folder 
    { 
     Name = "Root", 
     Folders = (from c in ifs.GetDirectoryNames() 
      select new Folder 
      { 
       Name = c, 
       Folders = LoadFolders(c) 
      }).ToList() 
    }; 
    _Folders.Add(folder); 
    FolderTreeView.DataContext = new { _Folders }; 
} 

private List<Folder>LoadFolders(string folderName) 
{ 
    if(folderName == null) 
     return null; 
    return (from c in ifs.GetDirectoryNames(folderName + "\\*.*") 
     select new Folder 
     { 
      Name = c, 
      Folders = LoadFolders(c) 
     }).ToList(); 
} 

Благодаря

ответ

1

Несколько вещей

<sdk:TreeView x:Name="FolderTreeView" Grid.Column="0" Margin="0,0,3,0" 
       ItemsSource="{Binding _Folders}"> 

вы не можете связываться с частными членами.

Вам необходимо использовать ObservableCollections вместо списков. Менеджер привязки эффективно прослушивает события CollectionChanged, выпущенные ObservableCollection, и уведомляет связанные элементы управления.

Вы хотите реализовать INotifyPropertyChanged и повысить уведомления PropertyChanged в своих установщиках свойств.

Наконец, вы установили DataContext для Treeview?

Также посмотрите в окне вывода отладки на предмет ошибок, связанных с привязкой.

Редактировать, хорошо попробовать:

FolderTreeView.DataContext = this; 

и завернуть _Folders в свойстве

public ObservableCollection <Folder> Folders 
    { 
    get 
     { 
     return _Folders; 
     } 
    set 
     { 
     _Folders = value; 
     OnPropertyChanged("Folders"); 
     } 
    } 

изменить ваши привязки к

<sdk:TreeView x:Name="FolderTreeView" Grid.Column="0" Margin="0,0,3,0" 
       ItemsSource="{Binding Folders}"> 

Я изменил вещи совсем немного,

public class Folder : INotifyPropertyChanged 
     { 

     public Folder(string folderName) 
      { 
      Name = folderName; 
      Folders = new ObservableCollection<Folder>(); 
      var _ifs = IsolatedStorageFile.GetUserStoreForApplication(); 

      if (folderName != null) 
       { 
       Folders = new ObservableCollection<Folder>(
         (from c in _ifs.GetDirectoryNames(folderName + "\\*.*") 
         select new Folder(folderName + "\\" + c) 
        )); 
       } 
      else 
       { 
       Folders = new ObservableCollection<Folder>(
         (from c in _ifs.GetDirectoryNames() 
         select new Folder(folderName + "\\" + c) 
       )); 
       } 
      } 


     public string Name { get; set; } 

     private ObservableCollection<Folder> _Folders; 
     public ObservableCollection<Folder> Folders 
      { 
      get { return _Folders; } 
      set { _Folders = value; OnPropertyChanged("RootFolder"); } 
      } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 
     protected void OnPropertyChanged(string propertyName) 
      { 
      if (PropertyChanged != null) 
       { 
       PropertyChanged(this, 
        new PropertyChangedEventArgs(propertyName)); 
       } 
      } 
     #endregion 
    } 



public partial class OpenFileDialog : UserControl 
    {  
    public OpenFileDialog() 
     { 
     InitializeComponent(); 

     RootFolder = new Folder (null); 
     RootFolders = new ObservableCollection<Folder>(); 
     RootFolders.Add(RootFolder); 

     FolderTreeView.DataContext = this; 
     } 


    private Folder _RootFolder; 
    public Folder RootFolder 
     { 
     get { return _RootFolder; } 
     set { _RootFolder = value; } 
     } 


    private ObservableCollection<Folder> _RootFolders; 
    public ObservableCollection<Folder> RootFolders 
     { 
     get { return _RootFolders; } 
     set { _RootFolders = value; } 
     } 

    } 

XAML

<sdk:TreeView x:Name="FolderTreeView" Margin="0,0,3,0" ItemsSource="{Binding RootFolders}"> 
    <sdk:TreeView.ItemTemplate> 
     <sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Folders}"> 
      <StackPanel> 
      <TextBlock Margin="0" Text="{Binding Name, Mode=OneWay}"/> 
      </StackPanel> 
     </sdk:HierarchicalDataTemplate> 
    </sdk:TreeView.ItemTemplate> 
</sdk:TreeView> 
+0

Спасибо за ваш ответ. Я устанавливаю DataContext выше (т. Е. FolderTreeView.DataContext = new {_Folders}). Изменено все «Список » на «ObservableCollection » и мой обзор ObservableCollection . Без изменений. –

+0

Имеет исключение в окне вывода. «Ошибка System.Windows.Data: невозможно получить значение« Папки ». Что мне нужно сделать, чтобы исправить это? –

+0

Опять же, спасибо. Это не имело никакого значения.В окне вывода все еще было такое же исключение. –

0

Хорошо ... проблема решена. Не понимаю почему.

У меня был ChildWindow как внутренний объем, а не общедоступный, потому что я не хотел, чтобы окно было просмотрено вне моей библиотеки классов Silverlight. Если кто-нибудь может ответить, почему это остановит привязку иерархических данных, но не стандартную привязку данных, которую я хотел бы знать.

+0

, потому что менеджер привязки не находится внутри вашей сборки, поэтому не может получить доступ к чему-либо внутреннему. –

+0

Благодарим за помощь. –

+0

Добро пожаловать. –