在SelectedItemChanged上绑定xaml到ObservableCollection返回null
本文关键字:ObservableCollection 返回 null xaml SelectedItemChanged 绑定 | 更新日期: 2023-09-27 18:06:09
我正在构建一个文件资源管理器,我有一个绑定到ObservableCollection的ListView,我想要的是当有人点击文件夹(左边的TreeView)时,它填充ListView并在文本块中填写正确的文件信息。
我发现这个帮助我得到我在哪里。但我仍然返回null在文本块。谢谢你的帮助!
有一个private string start_Path
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>
你可以将你的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
方法。
如果@MikeEason的想法是正确的,那么一个简单的null检查就可以了:
private void foldersItem_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if(e.NewValue == null)
return;
... // rest of your code
}