Подтвердить что ты не робот

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 для каждой записи. Как отобразить конкретное свойство, например имя?

4b9b3361

Ответ 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, чтобы показать необходимое мне свойство.