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?
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>
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;
}
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.
ToString
comme l'a suggéré Sayse.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}">
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.