c# - tutorial - wpf presentacion
¿WPF/C#Enlace de datos de lista de objetos personalizados a un ListBox? (4)
Me he topado con un poco de un muro con la posibilidad de enlazar los datos de mi lista de objetos personalizados a un ListBox
en WPF.
Este es el objeto personalizado:
public class FileItem
{
public string Name { get; set; }
public string Path { get; set; }
}
Y esta es la lista:
private List<FileItem> folder = new List<FileItem>();
public List<FileItem> Folder { get { return folder; } }
Un FileSystemWatcher
rellena y mantiene la lista a medida que los archivos se mueven, borran, renombran, etc. Todo lo que hace la lista es mantener un registro de nombres y rutas.
Esto es lo que tengo en el archivo de código subyacente de MainWindow (por ahora está codificado para propósitos de prueba):
FolderWatcher folder1 = new FolderWatcher();
folder1.Run(@"E:/MyApp/test", "*.txt");
listboxFolder1.ItemsSource = folder1.Folder;
Aquí está mi porción de XAML:
<ListBox x:Name="listboxFolder1" Grid.Row="1" BorderThickness="0"
ItemsSource="{Binding}"/>
Desafortunadamente, lo único que se muestra es MyApp.FileItem
para cada entrada. ¿Cómo muestro la propiedad específica como nombre?
Cada elemento de la lista que muestra ListBox muestra automáticamente el método ToString
para mostrarlo y, como no lo anuló, muestra el nombre del tipo.
Entonces, hay dos cosas que puedes hacer aquí.
-
ToString
método ToString como sugirió Sayse. - Usa DataTemplate y une cada una de tus propiedades por separado
En su recurso agregue la plantilla con una llave.
<DataTemplate x:Key="fileItemTemplate">
<StackPanel>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Path}"/>
</StackPanel>
</DataTemplate>
y dale como tu cuadro de lista
<ListBox x:Name="listboxFolder1" Grid.Row="1" BorderThickness="0" ItemsSource="{Binding}" ItemTemplate="{StaticResource fileItemTemplate}">
En caso de que alguien encuentre esto ahora a través de la búsqueda, acabo de encontrar casi el mismo problema en una aplicación C # UWP.
Si bien los bits de XAML en la respuesta de Nitin eran necesarios, no solucionaron el problema por sí solos, también tuve que cambiar mi equivalente de Folder
para que fuera una ObservableCollection
, en lugar de una List
, para que ListBox mostrara la propiedad que necesitaba. .
La forma más fácil es anular ToString
en su FileItem
, (el cuadro de lista usa esto para llenar cada entrada)
public override string ToString()
{
return Name;
}
Tendrá que definir el ItemTemplate para su ListBox
<ListBox x:Name="listboxFolder1" Grid.Row="1" BorderThickness="0"
ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>