2015-08-03 51 views
1

我建立一个文件浏览器,我有一个绑定到一个ObservableCollection我在想什么,当有人点击该文件夹(树形视图左侧)上一个ListView它填充列表视图并在文本块中填写正确的文件信息。绑定XAML对SelectedItemChanged的ObservableCollection返回null

我发现this帮助我到达我的所在地。但我仍然在文本块中返回空值。 感谢您的帮助!

我有一个private string start_Path

代码来填充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> 
+1

什么,在哪里回报'null'? – Sinatr

+0

View-model中的收藏属性在哪里? –

+0

我的文件名显示出来,剩下的就是空 – user3120232

回答

0

您可以改为绑定哟ur SelectedItem改为ViewModel中的某个房产。

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

而且你的视图模型将是这个样子:

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 
    } 
} 

然后,您可以实现方法:

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

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

利用这一点,DoSomethingUseful方法都会被调用一次选择变化。

+0

这是更MVVM的做法,但它不会改变任何事情只能使对'强调null'检查,这使得它('null'检查)可能的答案。 – Sinatr

0

如果@MikeEason的想法是正确的,那么一个简单的空检查将做到:

private void foldersItem_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
    if(e.NewValue == null) 
     return; 
    ... // rest of your code 
}