我遇到了一些问题,因为我能够将自定义对象列表的数据绑定到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
。如何显示名称等特定属性?
答案 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
方法来显示它,并且由于您没有覆盖它,它会显示该类型的名称。
所以,你可以在这里做两件事。
ToString
方法。在您的资源中添加带有密钥的模板
<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显示我需要的属性。