読者です 読者をやめる 読者になる 読者になる

プログラマーな日々

プログラマー兼SEです。好きなツール:WorkFlowy、好きな言語:C#、好きなAWSのサービス:EMR。

ディレクトリの子項目を階層的に表示する

.NET WPF

アプリ実行

起動


展開


ソースコード

App.xaml
<Application x:Class="WpfApplication6.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
</Application>
MainWindow.xaml
<Window x:Class="WpfApplication6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:m="clr-namespace:System.IO;assembly=mscorlib"
        xmlns:l="clr-namespace:WpfApplication6"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <l:ToDirectoryChildrenConveter x:Key="toDirectoryChildrenConveter" />
                </ResourceDictionary>
                <ResourceDictionary>
                    <HierarchicalDataTemplate
                        DataType="{x:Type m:DirectoryInfo}" 
                        ItemsSource="{Binding Converter={StaticResource toDirectoryChildrenConveter}}">
                        <TextBlock Text="{Binding Path=Name}" />
                    </HierarchicalDataTemplate>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    
    <TreeView ItemsSource="{Binding}" />
</Window>
MainWindow.xaml.cs
using System.IO;
using System.Windows;

namespace HelloWorld {
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();

            this.DataContext = new DirectoryInfo[] { new DirectoryInfo(@"c:\windows") };
        }
    }
}
ToDirectoryChildrenConveter.cs
using System;
using System.Globalization;
using System.IO;
using System.Windows.Data;

namespace WpfApplication6 {
    class ToDirectoryChildrenConveter : IValueConverter {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
            try {
                if (value is DirectoryInfo) {
                    return ((DirectoryInfo)value).GetDirectories();
                }
            }
            catch { }
            return null;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
            throw new NotImplementedException();
        }
    }
}

参考

HierarchicalDataTemplate クラス (System.Windows)
TreeViewItem や MenuItem などの HeaderedItemsControl をサポートする DataTemplate を表します。