簡體   English   中英

WPF / C#將自定義對象列表數據綁定到ListBox?

[英]WPF/C# Binding custom object list data to a ListBox?

我遇到了一些牆,能夠將我的自定義對象列表的數據綁定到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 如何顯示名稱等特定屬性?

您需要為ListBox定義ItemTemplate

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

最簡單的方法是覆蓋FileItem上的ToString ,(列表框使用它來填充每個條目)

    public override string ToString()
    {
        return Name;
    }

列表框中顯示的每個項目都會自動調用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}">

如果現在有人通過搜索遇到這個問題,我在C#UWP應用程序中遇到了幾乎相同的問題。

雖然Nitin上面的答案中的XAML位是必要的,但它們並沒有單獨解決問題 - 我還必須將我的等效Folder更改為ObservableCollection而不是List ,以使ListBox顯示我需要的屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM