【问题标题】:WPF/C# Binding custom object list data to a ListBox?WPF/C# 将自定义对象列表数据绑定到 ListBox?
【发布时间】:2013-09-09 06:40:55
【问题描述】:

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

【问题讨论】:

  • 那么问题出在哪里?绑定没绑定?列表框显示错误的文本?出错了?
  • @Sayse 已编辑。抱歉,我应该提到到底发生了什么。

标签: c# wpf list listbox listboxitems


【解决方案1】:

您需要为您的 ListBox 定义 ItemTemplate

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

【讨论】:

    【解决方案2】:

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

        public override string ToString()
        {
            return Name;
        }
    

    【讨论】:

    • 谢谢,它有效。我更喜欢 XAML 版本,但是这个版本也做得很好,就像你说的那样——它很简单。我只是想让 ToString() 对可能需要返回路径名或两者组合的其他事情保持打开状态。
    • 不同的是,这将在显示多个列表框时起作用:) 不用担心
    【解决方案3】:

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

    【讨论】:

    • 非常感谢你的链接,那家伙知道如何解释清楚。
    【解决方案4】:

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

    虽然上面 Nitin 的答案中的 XAML 位是必要的,但它们并不能单独解决问题——我还必须将我的 Folder 等价物更改为 ObservableCollection,而不是 List,以获取 ListBox 以显示我需要的属性。

    【讨论】:

      猜你喜欢
      • 2017-09-17
      • 1970-01-01
      • 2013-02-20
      • 2012-06-20
      • 1970-01-01
      • 2011-02-01
      • 2021-07-02
      • 2010-10-30
      • 1970-01-01
      相关资源
      最近更新 更多