Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF/C#将自定义对象列表数据绑定到列表框?_C#_Wpf_List_Listbox_Listboxitems - Fatal编程技术网

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

WPF/C#将自定义对象列表数据绑定到列表框?,c#,wpf,list,listbox,listboxitems,C#,Wpf,List,Listbox,Listboxitems,由于能够将自定义对象列表的数据绑定到WPF中的列表框,我遇到了一些麻烦 这是自定义对象: public class FileItem { public string Name { get; set; } public string Path { get; set; } } 以下是清单: private List<FileItem> folder = new List<FileItem>(); public List<FileItem> Fol

由于能够将自定义对象列表的数据绑定到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; } }
以下是我的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>

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

所以,这里有两件事你可以做

  • 像Sayse建议的那样重写
    ToString
    方法
  • 分别使用和绑定每个属性
  • 在资源中添加带有密钥的模板

            <DataTemplate x:Key="fileItemTemplate">
                <StackPanel>
                    <TextBlock Text="{Binding Name}"/>
                    <TextBlock Text="{Binding Path}"/>
                </StackPanel>
            </DataTemplate>
    
    
    
    并将其作为listbox ItemTemplate提供

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

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


    虽然上面Nitin的答案中的XAML位是必要的,但它们并不能单独解决这个问题——我还必须将我的等价的
    文件夹
    更改为
    可观察的集合
    ,而不是
    列表
    ,以使列表框显示我所需的属性。

    那么问题是什么呢?绑定没有绑定?列表框显示错误的文本?“有错误吗?”Sayse编辑道。对不起,我应该提到到底发生了什么。非常感谢你的链接,那个家伙知道如何清楚地解释事情。谢谢,这很有效。我更喜欢XAML版本,但这个版本也很好地完成了任务,就像你说的——它很简单。我只是想让ToString()保持打开状态,以便处理可能需要返回路径名或路径名组合的其他事项。区别在于,在显示多个列表框时,这将起作用:)不用担心
            <DataTemplate x:Key="fileItemTemplate">
                <StackPanel>
                    <TextBlock Text="{Binding Name}"/>
                    <TextBlock Text="{Binding Path}"/>
                </StackPanel>
            </DataTemplate>
    
    <ListBox x:Name="listboxFolder1" Grid.Row="1" BorderThickness="0"  ItemsSource="{Binding}" ItemTemplate="{StaticResource fileItemTemplate}">