无法让Silverlight HierarchicalDataTemplate显示IsolatedStorage文件夹

本文关键字:显示 IsolatedStorage 文件夹 HierarchicalDataTemplate Silverlight | 更新日期: 2023-09-27 18:08:10

这是我第一次尝试分层数据,我遇到了一点问题。

在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();
}

谢谢

无法让Silverlight HierarchicalDataTemplate显示IsolatedStorage文件夹

一些事情

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

不能绑定到私有成员

你需要使用ObservableCollections而不是列表。绑定管理器有效地监听由ObservableCollection触发的CollectionChanged事件,并通知绑定控件。

你需要实现INotifyPropertyChanged并在你的属性设置中引发PropertyChanged通知。

最后,你是否为Treeview设置了DataContext ?

另外,在输出调试窗口中查看与绑定相关的错误。

编辑,ok试试:

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>

Ok…问题解决了。我不明白为什么。

我把ChildWindow设置为内部作用域,而不是公共作用域,因为我不想让窗口本身在我的Silverlight类库外部被查看。如果有人能回答为什么这将停止分层数据绑定,而不是标准数据绑定,我想知道。