WPF/С# Связывание данных списка настраиваемых объектов с ListBox?
Я столкнулся с некоторой стеной, имея возможность привязывать данные моего пользовательского списка объектов к ListBox
в WPF.
Это настраиваемый объект:
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
для каждой записи. Как отобразить конкретное свойство, например имя?
Ответы
Ответ 1
Вам нужно будет определить ItemTemplate для вашего списка ListBox
<ListBox x:Name="listboxFolder1" Grid.Row="1" BorderThickness="0"
ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Ответ 2
Самый простой способ - переопределить ToString
на FileItem
, (этот список используется для заполнения каждой записи)
public override string ToString()
{
return Name;
}
Ответ 3
Каждый элемент в списке, который ListBox показывает автоматически, вызывает метод ToString
для его отображения, и поскольку вы его не переопределили, он отображает имя типа.
Итак, здесь вы можете сделать две вещи.
- Отмените метод
ToString
, например, предложенный Sayse.
- Используйте 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
Если кто-то сталкивается с этим сейчас через поиск, я просто столкнулся с такой же проблемой в приложении С# UWP.
Хотя бит XAML в ответе Nitin выше был необходим, они не исправили проблему в одиночку - мне также пришлось изменить свой эквивалент Folder
как ObservableCollection
, а не List
, чтобы получите ListBox, чтобы показать необходимое мне свойство.