24

ListBox在将自定义对象列表的数据绑定到WPF 中时,我遇到了一些困难。

这是自定义对象:

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每个条目。如何显示名称等特定属性?

4

4 回答 4

43

您需要为 ListBox 定义 ItemTemplate

    <ListBox x:Name="listboxFolder1" Grid.Row="1" BorderThickness="0" 
     ItemsSource="{Binding}">
       <ListBox.ItemTemplate>
         <DataTemplate>
           <TextBlock Text="{Binding Name}"/>
         </DataTemplate>
       </ListBox.ItemTemplate>
     </ListBox>
于 2013-09-09T07:01:42.157 回答
19

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

    public override string ToString()
    {
        return Name;
    }
于 2013-09-09T07:00:22.760 回答
10

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

因此,您可以在这里做两件事。

  1. ToString像 Sayse 建议的那样覆盖方法。
  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}">
于 2013-09-09T07:05:23.817 回答
4

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

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

于 2016-08-16T05:10:39.197 回答