24

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

4

4 に答える 4

43

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

    <ListBox x:Name="listboxFolder1" Grid.Row="1" BorderThickness="0" 
     ItemsSource="{Binding}">
       <ListBox.ItemTemplate>
         <DataTemplate>
           <TextBlock Text="{Binding Name}"/>
         </DataTemplate>
       </ListBox.ItemTemplate>
     </ListBox>
于 2013-09-09T07:01:42.157 に答える
19

最も簡単な方法は、 , をオーバーライドToStringすることですFileItem(リストボックスはこれを使用して各エントリを入力します)

    public override string ToString()
    {
        return Name;
    }
于 2013-09-09T07:00:22.760 に答える
10

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

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

  1. ToStringSayseが提案したようにメソッドをオーバーライドします。
  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}">
于 2013-09-09T07:05:23.817 に答える
4

誰かが検索でこれに出くわした場合に備えて、私は C# UWP アプリでほぼ同じ問題に遭遇しました。

上記の Nitin の回答の XAML ビットは必要でしたが、それだけでは問題は解決しませんでした。ListBox に必要なプロパティを表示させるには、同等のFolderものをObservableCollectionではなくに変更する必要がありました。List

于 2016-08-16T05:10:39.197 に答える