2

私はMVVMとWPFに比較的慣れていません。TreeViewコントロールをディレクトリとそのファイル/サブディレクトリ(実際には、解凍したzipファイルの内容)で埋めようとしています。

このSOの質問に続いて、次のクラスがあります。

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>

ツリービューの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コントロールが空白になっています。

問題はバインディングにあると思いますか?

4

1 に答える 1

2
  • <TreeView ItemsSource="{Binding}" ...に変更<TreeView ItemsSource="{Binding TVItems}" ...
  • また、に変更<HierarchicalDataTemplate DataType="{x:Type local:DirectoryItem}" ItemsSource="{Binding Items}" >
  • あなたのクラスはこのようでなければなりません:

     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<object>(すべて) に変更します。お
    役に立てば幸いです。

于 2012-08-28T19:27:11.533 に答える