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

25

我在使用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。我该如何显示特定的属性,比如名称?


2
那么问题是什么?绑定未绑定?列表框显示错误的文本?还是出现了错误? - Sayse
@Sayse 编辑。抱歉,我应该提到具体发生了什么。 - B.K.
4个回答

44

您需要为您的ListBox定义ItemTemplate

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

20

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

    public override string ToString()
    {
        return Name;
    }

谢谢,它有效。我更喜欢XAML版本,但这个也能胜任工作,就像你说的一样——很简单。我只是想保持ToString()开放,以便其他可能需要返回路径名或组合的东西。 - B.K.
区别在于这个可以在展示多个列表框时工作 :) 别担心。 - Sayse

10

ListBox显示的列表中的每个项目都会自动调用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}">

非常感谢您提供的链接,那个人很擅长清晰地解释事情。 - B.K.

4

如果有人通过搜索现在找到这篇文章,我刚在一个C# UWP应用程序中遇到了类似的问题。

尽管Nitin上面的XAML部分是必要的,但仅仅改变它们并不能解决问题 - 我还必须将我的 Folder 相当于改为 ObservableCollection ,而不是 List ,才能使 ListBox 显示我需要的属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接