カスタムオブジェクトリストのデータを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
すべてのエントリに対して。名前などの特定のプロパティを表示するにはどうすればよいですか?
ListBoxのItemTemplateを定義する必要があります
<ListBox x:Name="listboxFolder1" Grid.Row="1" BorderThickness="0"
ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
最も簡単な方法は、ToString
で FileItem
をオーバーライドすることです(リストボックスはこれを使用して各エントリに値を設定します)
public override string ToString()
{
return Name;
}
ListBoxが表示するリスト内の各アイテムは、ToString
メソッドを自動的に呼び出して表示します。オーバーライドしなかったため、タイプの名前が表示されます。
したがって、ここでできることは2つあります。
ToString
メソッドをオーバーライドします。リソースにキーを持つテンプレートを追加します
<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}">
誰かが検索で今これに出くわした場合、C#UWPアプリでほとんど同じ問題に遭遇しました。
上記のNitinの答えのXAMLビットは必要でしたが、問題だけを修正しませんでした-必要なプロパティを表示するListBoxを取得するには、Folder
ではなくObservableCollection
をList
に変更する必要がありました。