【问题标题】:HierarchicalDataTemplate with Treeview in MVVMMVVM 中带有 Treeview 的 HierarchicalDataTemplate
【发布时间】:2012-08-28 19:01:36
【问题描述】:

我对 MVVM 和 WPF 比较陌生。我正在尝试用一个目录和它的文件/子目录(实际上是我解压缩的 zip 文件的内容)填充 TreeView 控件

在这个 SO question 之后,我有以下课程:

namespace IFR_Full.Model
{
    public class Item
    {
        public string Name { get; set; }
        public string Path { get; set; }
    }

    public class FileItem : Item
    {
    }

    public class DirectoryItem : Item
    {
        public List<Item> Items { get; set; }

        public DirectoryItem()
        {
            Items = new List<Item>();
        }
    }

    public class TVItemProvider
    {
        public List<Item> GetItems(string path)
        {
            var items = new List<Item>();
            var dirInfo = new DirectoryInfo(path);

            foreach (var directory in dirInfo.GetDirectories())
            {
                var item = new DirectoryItem
                    {
                        Name = directory.Name,
                        Path = directory.FullName,
                        Items = GetItems(directory.FullName)
                    };
                items.Add(item);
            }

            foreach (var file in dirInfo.GetFiles())
            {
                var item = new FileItem
                {
                    Name = file.Name,
                    Path = file.FullName
                };
                items.Add(item);
            }
            return items;
        }
    }
}

在我的 ViewModel 类中,我有以下属性:

TVItemProvider TVIP = new TVItemProvider();

private List<Item> _tvitems;
public List<Item> TVItems
{
    get { return _tvitems; }
}

在这个方法中创建的:

private void LoadIDMLTreeView(string path)
{
    _tvitems = TVIP.GetItems(path);
}

我这样设置 MainWindow 的标题和 DataContext:

...
xmlns:ViewModel="clr-namespace:IFR_Full"
xmlns:Model ="clr-namespace:IFR_Full.Model"
...

<Window.DataContext>
    <ViewModel:ExcelImportViewModel/>
</Window.DataContext>

并像这样设置我的 treeview xaml 代码:

<TreeView ItemsSource="{Binding}" Name="IDMLView" Margin="10,171.74,10,8" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type Model:DirectoryItem}" ItemsSource="{Binding Path=TVItems}">
            <TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Path=Path}" />                  
        </HierarchicalDataTemplate> 
        <DataTemplate DataType="{x:Type Model:FileItem}">
     <TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Path=Path}" />
    </DataTemplate>             
 </TreeView.Resources>
</TreeView>

当我在调试模式下运行程序时,我可以看到 TVItems 包含适当的项目(目录和文件),但我的 TreeView 控件是空白的。

我想问题出在绑定上?

【问题讨论】:

    标签: wpf xaml binding treeview hierarchicaldatatemplate


    【解决方案1】:
    • 将&lt;TreeView ItemsSource="{Binding}" ... 更改为&lt;TreeView ItemsSource="{Binding TVItems}" ...
    • 另外,更改为&lt;HierarchicalDataTemplate DataType="{x:Type local:DirectoryItem}" ItemsSource="{Binding Items}" &gt;
    • 你的班级必须是这样的:

       public class TVItemProvider
          {
      
              List<object> items = new List<object>();
                DirectoryInfo dirInfo;
                public List<object> GetItems(string path)
              {
                  dirInfo = new DirectoryInfo(path);
                  foreach (var directory in dirInfo.GetDirectories())
                  {
                      var item = new DirectoryItem
                      {
                          Name = directory.Name,
                          Path = directory.FullName,
                          Items = new TVItemProvider().GetItems(directory.FullName)
                      };
                      items.Add(item);
                  }
      
                  foreach (var file in dirInfo.GetFiles())
                  {
                      var item = new FileItem
                      {
                          Name = file.Name,
                          Path = file.FullName
                      };
      
                      items.Add(item);
                  }
                  return items;
              }
      

      }

    • 最后将列表类型改为List&lt;object&gt;(全部)
      希望对您有所帮助

    【讨论】:

    • 当我进行此更改时,树视图仅填充顶级项目。我期待一个树形结构:DirectoryItems 有 FileItem subs。
    • 优秀的 HichemC!那行得通...现在我需要研究答案以了解您的所作所为!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    相关资源
    最近更新 更多