web-dev-qa-db-fra.com

WPF / C # Lier des données de liste d'objets personnalisées à un ListBox?

J'ai rencontré un peu un mur avec la possibilité de lier les données de ma liste d'objets personnalisés à un ListBox dans WPF.

Voici l'objet personnalisé:

public class FileItem
{
    public string Name { get; set; }
    public string Path { get; set; }
}

Et voici la liste:

private List<FileItem> folder = new List<FileItem>();
public List<FileItem> Folder { get { return folder; } }

La liste est remplie et maintenue par un FileSystemWatcher au fur et à mesure que les fichiers sont déplacés, supprimés, renommés, etc.

Voici ce que j'ai dans le fichier code-back de MainWindow (il est codé en dur à des fins de test pour l'instant):

FolderWatcher folder1 = new FolderWatcher();
folder1.Run(@"E:\MyApp\test", "*.txt");

listboxFolder1.ItemsSource = folder1.Folder;

Voici ma portion XAML:

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

Malheureusement, la seule chose qui s'affiche est MyApp.FileItem pour chaque entrée. Comment afficher la propriété spécifique telle que le nom?

22
B.K.

Vous devrez définir le ItemTemplate pour votre ListBox

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

Le moyen le plus simple est de remplacer ToString sur votre FileItem, (la liste de sélection l'utilise pour remplir chaque entrée)

    public override string ToString()
    {
        return Name;
    }
15
Sayse

Chaque élément de la liste que ListBox affiche appelle automatiquement la méthode ToString pour l'afficher, et puisque vous ne l'avez pas remplacé, il affiche le nom du type.

Donc, vous pouvez faire deux choses ici.

  1. Remplacez la méthode ToString comme l'a suggéré Sayse.
  2. Utilisez DataTemplate et liez séparément chacune de vos propriétés

Dans votre ressource ajoutez le modèle avec une clé

        <DataTemplate x:Key="fileItemTemplate">
            <StackPanel>
                <TextBlock Text="{Binding Name}"/>
                <TextBlock Text="{Binding Path}"/>
            </StackPanel>
        </DataTemplate>

et donnez-le comme votre listbox ItemTemplate

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

Au cas où quelqu'un trouverait cela maintenant via la recherche, je viens de rencontrer à peu près le même problème dans une application C # UWP.

Bien que les bits XAML dans la réponse de Nitin ci-dessus soient nécessaires, ils n'ont pas résolu le problème à eux seuls - j'ai également dû changer mon équivalent de Folder pour qu'il soit un ObservableCollection, plutôt qu'un List, pour que le ListBox affiche la propriété dont j'avais besoin.

2
amb9800