在SelectedItemChanged上绑定xaml到ObservableCollection返回null

本文关键字:ObservableCollection 返回 null xaml SelectedItemChanged 绑定 | 更新日期: 2023-09-27 18:06:09

我正在构建一个文件资源管理器,我有一个绑定到ObservableCollection的ListView,我想要的是当有人点击文件夹(左边的TreeView)时,它填充ListView并在文本块中填写正确的文件信息。

我发现这个帮助我得到我在哪里。但我仍然返回null在文本块。谢谢你的帮助!

有一个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>

在SelectedItemChanged上绑定xaml到ObservableCollection返回null

你可以将你的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
}