繁体   English   中英

WPF / C#将自定义对象列表数据绑定到ListBox?

[英]WPF/C# Binding custom object list data to a ListBox?

我遇到了一些墙,能够将我的自定义对象列表的数据绑定到WPF中的ListBox

这是自定义对象:

public class FileItem
{
    public string Name { get; set; }
    public string Path { get; set; }
}

这是清单:

private List<FileItem> folder = new List<FileItem>();
public List<FileItem> Folder { get { return folder; } }

当文件被移动,删除,重命名等时,该列表由FileSystemWatcher填充和维护。所有列表都保留了名称和路径的轨道。

这是我在MainWindow代码隐藏文件中所拥有的内容(现在它的硬编码用于测试目的):

FolderWatcher folder1 = new FolderWatcher();
folder1.Run(@"E:\MyApp\test", "*.txt");

listboxFolder1.ItemsSource = folder1.Folder;

这是我的XAML部分:

<ListBox x:Name="listboxFolder1" Grid.Row="1" BorderThickness="0" 
         ItemsSource="{Binding}"/>

不幸的是,唯一显示的是每个条目的MyApp.FileItem 如何显示名称等特定属性?

您需要为ListBox定义ItemTemplate

    <ListBox x:Name="listboxFolder1" Grid.Row="1" BorderThickness="0" 
     ItemsSource="{Binding}">
       <ListBox.ItemTemplate>
         <DataTemplate>
           <TextBlock Text="{Binding Name}"/>
         </DataTemplate>
       </ListBox.ItemTemplate>
     </ListBox>

最简单的方法是覆盖FileItem上的ToString ,(列表框使用它来填充每个条目)

    public override string ToString()
    {
        return Name;
    }

列表框中显示的每个项目都会自动调用ToString方法来显示它,并且由于您没有覆盖它,因此它会显示该类型的名称。

所以,你可以在这里做两件事。

  1. 像Sayse建议的那样覆盖ToString方法。
  2. 使用DataTemplate单独绑定每个属性

在您的资源中,使用密钥添加模板

        <DataTemplate x:Key="fileItemTemplate">
            <StackPanel>
                <TextBlock Text="{Binding Name}"/>
                <TextBlock Text="{Binding Path}"/>
            </StackPanel>
        </DataTemplate>

并将其作为列表框ItemTemplate

<ListBox x:Name="listboxFolder1" Grid.Row="1" BorderThickness="0"  ItemsSource="{Binding}" ItemTemplate="{StaticResource fileItemTemplate}">

如果现在有人通过搜索遇到这个问题,我在C#UWP应用程序中遇到了几乎相同的问题。

虽然Nitin上面的答案中的XAML位是必要的,但它们并没有单独解决问题 - 我还必须将我的等效Folder更改为ObservableCollection而不是List ,以使ListBox显示我需要的属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM