web-dev-qa-db-ja.com

WPF / C#カスタムオブジェクトリストデータをListBoxにバインドしますか?

カスタムオブジェクトリストのデータをWPFのListBoxにバインドできるため、ちょっとした壁にぶつかりました。

これはカスタムオブジェクトです。

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すべてのエントリに対して。名前などの特定のプロパティを表示するにはどうすればよいですか?

22
B.K.

ListBoxのItemTemplateを定義する必要があります

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

最も簡単な方法は、ToStringFileItem をオーバーライドすることです(リストボックスはこれを使用して各エントリに値を設定します)

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

ListBoxが表示するリスト内の各アイテムは、ToStringメソッドを自動的に呼び出して表示します。オーバーライドしなかったため、タイプの名前が表示されます。

したがって、ここでできることは2つあります。

  1. Sayseが提案したToStringメソッドをオーバーライドします。
  2. 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}">
6
Omri Btian

誰かが検索で今これに出くわした場合、C#UWPアプリでほとんど同じ問題に遭遇しました。

上記のNitinの答えのXAMLビットは必要でしたが、問題だけを修正しませんでした-必要なプロパティを表示するListBoxを取得するには、FolderではなくObservableCollectionListに変更する必要がありました。

2
amb9800