2013-04-09 6 views
0

이것은 계층 적 데이터를 처음 접하는 문제이며 약간의 문제가 있습니다.Silverlight HierarchicalDataTemplate을 사용하여 IsolatedStorage 폴더를 표시 할 수 없습니다.

Silverlight 4에서 TreeView에 표시 할 격리 된 저장소 폴더 목록을 가져 오려고합니다. 아무것도 표시되지 않습니다. 내 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를 사용해야합니다. 바인딩 관리자는 ObservableCollection에 의해 시작된 CollectionChanged 이벤트를 효과적으로 수신하고 바인딩 된 컨트롤에 알립니다.

INotifyPropertyChanged를 구현하고 속성 설정자에서 PropertyChanged 알림을 발생시킬 수 있습니다.

마지막으로 Treeview에 대한 DataContext를 설정 했습니까?

또한 출력 디버그 창에서 바인딩과 관련된 오류를 확인하십시오.

편집, 확인을 시도 :

FolderTreeView.DataContext = this; 

내가 꽤 일을 변경 한 당신의 바인딩에

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

속성

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

변화 _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}). "List "을 "ObservableCollection "으로 변경하고 최상위 ObservableCollection 을 공개로 변경했습니다. 변경 없음. –

+0

출력 창에 예외가있었습니다. "System.Windows.Data 오류 : '폴더 값'을 가져올 수 없습니다. 이 문제를 해결하려면 무엇을해야합니까? –

+0

다시 감사합니다. 이것은 아무런 효과가 없었다.출력 창에서 여전히 동일한 예외가 발생했습니다. –

0

좋아 ... 문제는 해결. 왜 그래도 이해가 안 돼요.

내 Silverlight 클래스 라이브러리 외부에서 창 자체를 볼 수 없기 때문에 ChildWindow를 공용 범위 대신 내부 범위로 설정했습니다. 누구나 이것이 왜 계층 적 데이터 바인딩을 중단하지만 표준 데이터 바인딩을 중단 시킬지를 대답 할 수 있다면 알고 싶습니다.

+0

바인딩 관리자가 어셈블리 내부에 없으므로 내부에 액세스 할 수 없기 때문에 –

+0

도움을 주셔서 감사합니다. –

+0

당신을 진심으로 환영합니다. –