1

I am building a file explorer, I have a ListView that is bound to an ObservableCollection what I'm wanting is when someone click on the folder (A TreeView to the left) it populates the Listview and fill the correct File Information in the text blocks.

I have found this which helped me get to where I am. but I am still returning null in the text blocks. Thanks for the help!

I have a private string start_Path

Code to populate ListView:

private void load_ListView(string path)
{
    var lv = File_List;
    lv.Items.Clear();
    var search_Directory = new DirectoryInfo(path);
    var item = new ListViewItem();
    try
    {

        foreach (var file in search_Directory.GetFiles())
        {

            lv.Items.Add(file);
        }
    }
    catch (Exception ex)
    {

    }

}
private void frm_File_Directory_Loaded(object sender, RoutedEventArgs e)
{
    ListDirectory(foldersItem, start_Path.ToString());
}

private void foldersItem_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    load_ListView( start_Path + "\\" + ((TreeViewItem)e.NewValue).Header.ToString());
    folder_Name = ((TreeViewItem)e.NewValue).Header.ToString();
    this.DataContext = File_Info_data.get_Files(start_Path + "\\" + ((TreeViewItem)e.NewValue).Header.ToString());            
}

ObservableCollection:

   public static ObservableCollection<File_Information> get_Files(string path)
    {
        var temp = new ObservableCollection<File_Information>();
        File_Information file;
        FileInfo fileInfo = new FileInfo(path);
        try
        {
            file = new File_Information
            {
                file_Size = fileInfo.Length,
                date_Modified = fileInfo.LastWriteTime,
                file_Type = get_File_Type(fileInfo.Extension)
            };

            temp.Add(file);

            return temp;
        }
        catch (Exception ex) { }
        return null;
    }


    public static string get_File_Type(string extension)
    {
        string ext_Name = null;
        switch (extension)
        {
            case @"xlsx":
            case "xlsm":
            case "xls":
                ext_Name = "Excel File";
                break;           
            case "docx":
            case "docm":
            case "doc":
                ext_Name = "Word Document";
                break;
            case "pdf":
                ext_Name = "PDF Document";
                break;
            case "cad":
                ext_Name = "CAD File";
                break;
            case "DWG":
                ext_Name = "AutoCAD Drawing";
                break;
            case "jpg":
                ext_Name = "JPEG image";
                break;
            default:
                ext_Name = "Unknown File Type";
                break;
        }
        return ext_Name;
    }

xaml:

   <ListView.ItemTemplate>
        <DataTemplate>

            <StackPanel Orientation="Horizontal">
                <Image Source="{Binding Converter={StaticResource PathConverter}}"
                                Height="20"
                                Width="20"
                                Stretch="UniformToFill"
                                />
                <TextBlock x:Name="file_Name" Text="{Binding}" Width="300"></TextBlock>
                <TextBlock x:Name="Date_Modified" Text="{Binding date_Modified}" Width="200"></TextBlock>
                <TextBlock x:Name="File_Type" Text="{Binding file_Type}" Width="150"></TextBlock>
                <TextBlock x:Name="File_Size" Text="{Binding  file_Size}" Width="150"></TextBlock>
            </StackPanel>

        </DataTemplate>
    </ListView.ItemTemplate>


</ListView>
Community
  • 1
  • 1
3xGuy
  • 2,235
  • 2
  • 29
  • 51

2 Answers2

0

You could instead bind your SelectedItem to a property in your ViewModel instead.

<ListView ItemsSource="{Binding SomeCollection}"
          SelectedItem="{Binding SelectedThing}"
          ...

And your View Model will look something like this:

private Thing _SelectedThing;

public Thing SelectedThing
{ 
    get { return _SelectedThing; }
    set 
    {
        _SelectedThing = value;

        //Call a method and send whatever has been selected.
        DoSomethingUseful(value);

        //TODO: Notify property changed
    }
}

You can then implement the method:

private void DoSomethingUseful(Thing thing)
{  
    if (thing == null)
        return;

    //TODO: Whatever you need to do here.
}

Using this, the DoSomethingUseful method will be called every time the selection changes.

Mike Eason
  • 9,525
  • 2
  • 38
  • 63
  • That's more MVVM approach, but it doesn't change a thing only makes emphasis on `null` check, which makes it (`null` check) a possible answer. – Sinatr Aug 03 '15 at 13:18
0

If @MikeEason idea is right, then a simple null check will do:

private void foldersItem_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    if(e.NewValue == null)
        return;
    ... // rest of your code
}
Sinatr
  • 20,892
  • 15
  • 90
  • 319