ファイラーその3

ListBoxからListViewに変えてみる。

MainWindow.xaml

<Window x:Class="filer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:IO="clr-namespace:System.IO;assembly=mscorlib"
        Title="Filer" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="ListViewItem">
            <EventSetter Event="MouseDoubleClick" Handler="listBoxItem_DoubleClick"/>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <TextBox Grid.Column="0" Name="currentFolder" Text="{Binding Path=Path}" />
            <Button Grid.Column="1" Name="goParent" Width="30" Content=".." Click="goParent_Click" Cursor="Hand"/>
        </Grid>
        <ScrollViewer Grid.Row="1" >
            <ListView ItemsSource="{Binding Path=Files}" AlternationCount="2">
                <ListView.View>
                    <GridView>
                        <GridView.Columns>
                            <GridViewColumn Header="Name">
                                <GridViewColumn.CellTemplate>
                                    <DataTemplate>
                                        <Label Content="{Binding Path=Name}"/>
                                    </DataTemplate>
                                </GridViewColumn.CellTemplate>
                            </GridViewColumn>
                            <GridViewColumn Header="Size">
                                <GridViewColumn.CellTemplate>
                                    <DataTemplate>
                                        <Label Content="{Binding Path=Length}"/>
                                    </DataTemplate>
                                </GridViewColumn.CellTemplate>
                            </GridViewColumn>
                        </GridView.Columns>
                    </GridView>
                </ListView.View>
            </ListView>
        </ScrollViewer>
    </Grid>
</Window>

ListBoxをListViewに変更して、中のGridViewにカラムを2つ作った。
さらにDataTemplateをWindow.ResourcesからGridViewColumn.CellTemplateに移動した。
DataTypeとColumn番号からDataTemplateを選択する方法を模索したのだが、
CellTemplateSelectorを書く方法しか見つからなかったのでなるべくxamlだけで済ます方針から見送った。

右寄せにする

Styleで伸ばしてから

        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>

DataTemplateで右に寄せる

                                    <DataTemplate>
                                        <Label Content="{Binding Path=Length}" HorizontalAlignment="Right"/>
                                    </DataTemplate>

スタイルをResourcesからListViewの下に移動する

                <ListView.ItemContainerStyle>
                    <Style TargetType="{x:Type ListViewItem}"  >
                        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                        <EventSetter Event="MouseDoubleClick" Handler="listBoxItem_DoubleClick"/>
                    </Style>
                </ListView.ItemContainerStyle>

FileSystemInfoのラッパを作ってLengthプロパティアクセス時にエラーが出ないようにする

DirectoryInfo.Lengthにアクセスしたとき、そんなプロパティは無いというエラーが出る。
ObservableCollectionからObservableCollectionに換装する。

    class Item
    {
        public bool IsDirectory
        {
            set;
            get;
        }

        public FileSystemInfo Info
        {
            set;
            get;
        }

        public String Name
        {
            get { return Info.Name; }
        }

        public String Length
        {
            get
            {
                var file = Info as FileInfo;
                if (file == null)
                {
                    return "";
                }
                else
                {
                    return file.Length.ToString();
                }
            }
        }
    };

ToDo: アイコンをつける