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

时间:2013-09-09 06:40:56

标签: c# wpf list listbox listboxitems

我遇到了一些问题,因为我能够将自定义对象列表的数据绑定到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。如何显示名称等特定属性?

4 个答案:

答案 0 :(得分:40)

您需要为ListBox定义ItemTemplate

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

答案 1 :(得分:15)

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

    public override string ToString()
    {
        return Name;
    }

答案 2 :(得分:5)

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

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

  1. 覆盖像Sayse建议的ToString方法。
  2. 使用DataTemplate并单独绑定每个属性
  3. 在您的资源中添加带有密钥的模板

            <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}">
    

答案 3 :(得分:2)

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

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